diff --git a/frontend/app_flowy/lib/core/notification_helper.dart b/frontend/app_flowy/lib/core/notification_helper.dart index 88b299aa3a..d815bf92bb 100644 --- a/frontend/app_flowy/lib/core/notification_helper.dart +++ b/frontend/app_flowy/lib/core/notification_helper.dart @@ -4,7 +4,9 @@ import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart'; import 'package:dartz/dartz.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-folder/dart_notification.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/dart_notification.pb.dart'; +// User typedef UserNotificationCallback = void Function(UserNotification, Either); class UserNotificationParser extends NotificationParser { @@ -17,10 +19,11 @@ class UserNotificationParser extends NotificationParser); +// Folder +typedef FolderNotificationCallback = void Function(FolderNotification, Either); class FolderNotificationParser extends NotificationParser { - FolderNotificationParser({String? id, required NotificationCallback callback}) + FolderNotificationParser({String? id, required FolderNotificationCallback callback}) : super( id: id, callback: callback, @@ -29,6 +32,19 @@ class FolderNotificationParser extends NotificationParser); + +class GridNotificationParser extends NotificationParser { + GridNotificationParser({String? id, required GridNotificationCallback callback}) + : super( + id: id, + callback: callback, + tyParser: (ty) => GridNotification.valueOf(ty), + errorParser: (bytes) => FlowyError.fromBuffer(bytes), + ); +} + class NotificationParser { String? id; void Function(T, Either) callback; diff --git a/frontend/app_flowy/lib/plugin/plugin.dart b/frontend/app_flowy/lib/plugin/plugin.dart index 58b428cb94..607ebaab53 100644 --- a/frontend/app_flowy/lib/plugin/plugin.dart +++ b/frontend/app_flowy/lib/plugin/plugin.dart @@ -52,7 +52,7 @@ abstract class PluginBuilder { PluginType get pluginType; - ViewDataType get dataType => ViewDataType.Block; + ViewDataType get dataType => ViewDataType.TextBlock; } abstract class PluginConfig { diff --git a/frontend/app_flowy/lib/startup/home_deps_resolver.dart b/frontend/app_flowy/lib/startup/home_deps_resolver.dart index f8c8d60e8f..2dcf6ca077 100644 --- a/frontend/app_flowy/lib/startup/home_deps_resolver.dart +++ b/frontend/app_flowy/lib/startup/home_deps_resolver.dart @@ -1,29 +1,19 @@ import 'package:app_flowy/user/application/user_listener.dart'; import 'package:app_flowy/user/application/user_service.dart'; -import 'package:app_flowy/workspace/application/app/app_bloc.dart'; -import 'package:app_flowy/workspace/application/app/app_listener.dart'; -import 'package:app_flowy/workspace/application/app/app_service.dart'; -import 'package:app_flowy/workspace/application/doc/doc_bloc.dart'; -import 'package:app_flowy/workspace/application/doc/doc_service.dart'; -import 'package:app_flowy/workspace/application/doc/share_bloc.dart'; -import 'package:app_flowy/workspace/application/doc/share_service.dart'; -import 'package:app_flowy/workspace/application/grid/grid_bloc.dart'; -import 'package:app_flowy/workspace/application/grid/grid_service.dart'; -import 'package:app_flowy/workspace/application/home/home_listen_bloc.dart'; -import 'package:app_flowy/workspace/application/menu/menu_bloc.dart'; -import 'package:app_flowy/workspace/application/menu/menu_user_bloc.dart'; -import 'package:app_flowy/workspace/application/trash/trash_bloc.dart'; -import 'package:app_flowy/workspace/application/trash/trash_listener.dart'; -import 'package:app_flowy/workspace/application/trash/trash_service.dart'; -import 'package:app_flowy/workspace/application/view/view_bloc.dart'; -import 'package:app_flowy/workspace/application/view/view_listener.dart'; -import 'package:app_flowy/workspace/application/view/view_service.dart'; -import 'package:app_flowy/workspace/application/workspace/welcome_bloc.dart'; -import 'package:app_flowy/workspace/application/workspace/workspace_listener.dart'; -import 'package:app_flowy/workspace/application/workspace/workspace_service.dart'; +import 'package:app_flowy/workspace/application/app/prelude.dart'; +import 'package:app_flowy/workspace/application/doc/prelude.dart'; +import 'package:app_flowy/workspace/application/grid/prelude.dart'; +import 'package:app_flowy/workspace/application/grid/row_listener.dart'; +import 'package:app_flowy/workspace/application/trash/prelude.dart'; +import 'package:app_flowy/workspace/application/workspace/prelude.dart'; +import 'package:app_flowy/workspace/application/view/prelude.dart'; +import 'package:app_flowy/workspace/application/home/prelude.dart'; +import 'package:app_flowy/workspace/application/menu/prelude.dart'; + import 'package:app_flowy/workspace/presentation/home/home_stack.dart'; import 'package:flowy_sdk/protobuf/flowy-folder-data-model/app.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-user-data-model/user_profile.pb.dart'; import 'package:get_it/get_it.dart'; @@ -101,9 +91,50 @@ class HomeDepsResolver { // Grid getIt.registerFactoryParam( - (view, _) => GridBloc( - view: view, - service: GridService(), + (view, _) => GridBloc(view: view, service: GridService()), + ); + + getIt.registerFactoryParam( + (data, _) => RowBloc( + rowService: RowService(data), + listener: RowListener(rowId: data.rowId), + ), + ); + + getIt.registerFactoryParam, void>( + (data, _) => ColumnBloc( + data: GridColumnData(fields: data), + service: ColumnService(), + ), + ); + + getIt.registerFactoryParam( + (context, _) => TextCellBloc( + service: CellService(context), + ), + ); + + getIt.registerFactoryParam( + (context, _) => SelectionCellBloc( + service: CellService(context), + ), + ); + + getIt.registerFactoryParam( + (context, _) => NumberCellBloc( + service: CellService(context), + ), + ); + + getIt.registerFactoryParam( + (context, _) => DateCellBloc( + service: CellService(context), + ), + ); + + getIt.registerFactoryParam( + (context, _) => CheckboxCellBloc( + service: CellService(context), ), ); diff --git a/frontend/app_flowy/lib/workspace/application/app/prelude.dart b/frontend/app_flowy/lib/workspace/application/app/prelude.dart new file mode 100644 index 0000000000..f8477049d3 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/app/prelude.dart @@ -0,0 +1,3 @@ +export 'app_bloc.dart'; +export 'app_listener.dart'; +export 'app_service.dart'; diff --git a/frontend/app_flowy/lib/workspace/application/doc/prelude.dart b/frontend/app_flowy/lib/workspace/application/doc/prelude.dart new file mode 100644 index 0000000000..f2befe4cf0 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/doc/prelude.dart @@ -0,0 +1,4 @@ +export 'doc_bloc.dart'; +export 'doc_service.dart'; +export 'share_bloc.dart'; +export 'share_service.dart'; diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_service.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_service.dart new file mode 100644 index 0000000000..44cf86e5d2 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_service.dart @@ -0,0 +1,20 @@ +import 'package:app_flowy/workspace/application/grid/row_service.dart'; +import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; +import 'package:dartz/dartz.dart'; +import 'package:flowy_sdk/dispatch/dispatch.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/meta.pb.dart'; + +class CellService { + final GridCellData context; + + CellService(this.context); + + Future> updateCell({required String data}) { + final payload = CellMetaChangeset.create() + ..gridId = context.gridId + ..fieldId = context.field.id + ..rowId = context.rowId + ..data = data; + return GridEventUpdateCell(payload).send(); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart new file mode 100644 index 0000000000..ab844448dc --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart @@ -0,0 +1,42 @@ +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'cell_service.dart'; + +part 'checkbox_cell_bloc.freezed.dart'; + +class CheckboxCellBloc extends Bloc { + final CellService service; + + CheckboxCellBloc({ + required this.service, + }) : super(CheckboxCellState.initial(service.context.cell)) { + on( + (event, emit) async { + await event.map( + initial: (_InitialCell value) async {}, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +abstract class CheckboxCellEvent with _$CheckboxCellEvent { + const factory CheckboxCellEvent.initial() = _InitialCell; +} + +@freezed +abstract class CheckboxCellState with _$CheckboxCellState { + const factory CheckboxCellState({ + required Cell? cell, + }) = _CheckboxCellState; + + factory CheckboxCellState.initial(Cell? cell) => CheckboxCellState(cell: cell); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/date_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/date_cell_bloc.dart new file mode 100644 index 0000000000..dcb0461165 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/date_cell_bloc.dart @@ -0,0 +1,42 @@ +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'cell_service.dart'; + +part 'date_cell_bloc.freezed.dart'; + +class DateCellBloc extends Bloc { + final CellService service; + + DateCellBloc({ + required this.service, + }) : super(DateCellState.initial(service.context.cell)) { + on( + (event, emit) async { + await event.map( + initial: (_InitialCell value) async {}, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +abstract class DateCellEvent with _$DateCellEvent { + const factory DateCellEvent.initial() = _InitialCell; +} + +@freezed +abstract class DateCellState with _$DateCellState { + const factory DateCellState({ + required Cell? cell, + }) = _DateCellState; + + factory DateCellState.initial(Cell? cell) => DateCellState(cell: cell); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/number_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/number_cell_bloc.dart new file mode 100644 index 0000000000..caa91fa408 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/number_cell_bloc.dart @@ -0,0 +1,42 @@ +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'cell_service.dart'; + +part 'number_cell_bloc.freezed.dart'; + +class NumberCellBloc extends Bloc { + final CellService service; + + NumberCellBloc({ + required this.service, + }) : super(NumberCellState.initial(service.context.cell)) { + on( + (event, emit) async { + await event.map( + initial: (_InitialCell value) async {}, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +abstract class NumberCellEvent with _$NumberCellEvent { + const factory NumberCellEvent.initial() = _InitialCell; +} + +@freezed +abstract class NumberCellState with _$NumberCellState { + const factory NumberCellState({ + required Cell? cell, + }) = _NumberCellState; + + factory NumberCellState.initial(Cell? cell) => NumberCellState(cell: cell); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_cell_bloc.dart new file mode 100644 index 0000000000..7f21a84fff --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_cell_bloc.dart @@ -0,0 +1,42 @@ +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'cell_service.dart'; + +part 'selection_cell_bloc.freezed.dart'; + +class SelectionCellBloc extends Bloc { + final CellService service; + + SelectionCellBloc({ + required this.service, + }) : super(SelectionCellState.initial(service.context.cell)) { + on( + (event, emit) async { + await event.map( + initial: (_InitialCell value) async {}, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +abstract class SelectionCellEvent with _$SelectionCellEvent { + const factory SelectionCellEvent.initial() = _InitialCell; +} + +@freezed +abstract class SelectionCellState with _$SelectionCellState { + const factory SelectionCellState({ + required Cell? cell, + }) = _SelectionCellState; + + factory SelectionCellState.initial(Cell? cell) => SelectionCellState(cell: cell); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/text_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/text_cell_bloc.dart new file mode 100644 index 0000000000..80bc722be7 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/text_cell_bloc.dart @@ -0,0 +1,45 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'cell_service.dart'; + +part 'text_cell_bloc.freezed.dart'; + +class TextCellBloc extends Bloc { + final CellService service; + + TextCellBloc({ + required this.service, + }) : super(TextCellState.initial(service.context.cell?.content ?? "")) { + on( + (event, emit) async { + await event.map( + initial: (_InitialCell value) async {}, + updateText: (_UpdateText value) { + service.updateCell(data: value.text); + }, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +abstract class TextCellEvent with _$TextCellEvent { + const factory TextCellEvent.initial() = _InitialCell; + const factory TextCellEvent.updateText(String text) = _UpdateText; +} + +@freezed +abstract class TextCellState with _$TextCellState { + const factory TextCellState({ + required String content, + }) = _TextCellState; + + factory TextCellState.initial(String content) => TextCellState(content: content); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/column_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/column_bloc.dart new file mode 100644 index 0000000000..39badc922a --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/column_bloc.dart @@ -0,0 +1,42 @@ +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'column_service.dart'; +import 'data.dart'; + +part 'column_bloc.freezed.dart'; + +class ColumnBloc extends Bloc { + final ColumnService service; + final GridColumnData data; + + ColumnBloc({required this.data, required this.service}) : super(ColumnState.initial(data.fields)) { + on( + (event, emit) async { + await event.map( + initial: (_InitialColumn value) async {}, + createColumn: (_CreateColumn value) {}, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +abstract class ColumnEvent with _$ColumnEvent { + const factory ColumnEvent.initial() = _InitialColumn; + const factory ColumnEvent.createColumn() = _CreateColumn; +} + +@freezed +abstract class ColumnState with _$ColumnState { + const factory ColumnState({required List fields}) = _ColumnState; + + factory ColumnState.initial(List fields) => ColumnState(fields: fields); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/column_service.dart b/frontend/app_flowy/lib/workspace/application/grid/column_service.dart new file mode 100644 index 0000000000..c074dcf616 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/column_service.dart @@ -0,0 +1 @@ +class ColumnService {} diff --git a/frontend/app_flowy/lib/workspace/application/grid/data.dart b/frontend/app_flowy/lib/workspace/application/grid/data.dart new file mode 100644 index 0000000000..ff1b1e3efc --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/data.dart @@ -0,0 +1,7 @@ +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; + +class GridColumnData { + final List fields; + + GridColumnData({required this.fields}); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart index b915435343..1db06d815c 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart @@ -1,30 +1,30 @@ import 'dart:async'; - import 'package:dartz/dartz.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-grid-data-model/protobuf.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; - +import 'grid_block_service.dart'; +import 'grid_listenr.dart'; import 'grid_service.dart'; part 'grid_bloc.freezed.dart'; class GridBloc extends Bloc { - final GridService service; final View view; - Grid? _grid; - List? _fields; + final GridService service; + late GridListener _gridListener; + late GridBlockService _blockService; GridBloc({required this.view, required this.service}) : super(GridState.initial()) { + _gridListener = GridListener(); + on( (event, emit) async { await event.map( - initial: (Initial value) async { + initial: (InitialGrid value) async { await _loadGrid(emit); - await _loadFields(emit); - await _loadGridInfo(emit); }, createRow: (_CreateRow value) { service.createRow(gridId: view.id); @@ -32,6 +32,9 @@ class GridBloc extends Bloc { delete: (_Delete value) {}, rename: (_Rename value) {}, updateDesc: (_Desc value) {}, + didLoadRows: (_DidLoadRows value) { + emit(state.copyWith(rows: value.rows)); + }, ); }, ); @@ -39,72 +42,90 @@ class GridBloc extends Bloc { @override Future close() async { + await _gridListener.stop(); + await _blockService.stop(); return super.close(); } + Future _startGridListening() async { + _blockService.didLoadRowscallback = (rows) { + add(GridEvent.didLoadRows(rows)); + }; + + _gridListener.start(); + } + Future _loadGrid(Emitter emit) async { final result = await service.openGrid(gridId: view.id); - result.fold( - (grid) { - _grid = grid; - }, - (err) { - emit(state.copyWith(loadingState: GridLoadingState.finish(right(err)))); - }, + + return Future( + () => result.fold( + (grid) async => await _loadFields(grid, emit), + (err) => emit(state.copyWith(loadingState: GridLoadingState.finish(right(err)))), + ), ); } - Future _loadFields(Emitter emit) async { - if (_grid != null) { - final result = await service.getFields(gridId: _grid!.id, fieldOrders: _grid!.fieldOrders); - result.fold( - (fields) { - _fields = fields.items; - }, - (err) { - emit(state.copyWith(loadingState: GridLoadingState.finish(right(err)))); - }, - ); - } + Future _loadFields(Grid grid, Emitter emit) async { + final result = await service.getFields(gridId: grid.id, fieldOrders: grid.fieldOrders); + return Future( + () => result.fold( + (fields) => _loadGridBlocks(grid, fields.items, emit), + (err) => emit(state.copyWith(loadingState: GridLoadingState.finish(right(err)))), + ), + ); } - Future _loadGridInfo(Emitter emit) async { - if (_grid != null && _fields != null) { - final result = await service.getRows(gridId: _grid!.id, rowOrders: _grid!.rowOrders); - result.fold((repeatedRow) { - final rows = repeatedRow.items; - final gridInfo = GridInfo(rows: rows, fields: _fields!); - emit( - state.copyWith(loadingState: GridLoadingState.finish(left(unit)), gridInfo: some(left(gridInfo))), + Future _loadGridBlocks(Grid grid, List fields, Emitter emit) async { + final result = await service.getGridBlocks(gridId: grid.id, blockOrders: grid.blockOrders); + result.fold( + (repeatedGridBlock) { + final gridBlocks = repeatedGridBlock.items; + final gridId = view.id; + _blockService = GridBlockService( + gridId: gridId, + fields: fields, + gridBlocks: gridBlocks, ); - }, (err) { - emit( - state.copyWith(loadingState: GridLoadingState.finish(right(err)), gridInfo: none()), - ); - }); - } + final rows = _blockService.rows(); + + _startGridListening(); + emit(state.copyWith( + grid: Some(grid), + fields: Some(fields), + rows: rows, + loadingState: GridLoadingState.finish(left(unit)), + )); + }, + (err) => emit(state.copyWith(loadingState: GridLoadingState.finish(right(err)), rows: [])), + ); } } @freezed abstract class GridEvent with _$GridEvent { - const factory GridEvent.initial() = Initial; + const factory GridEvent.initial() = InitialGrid; const factory GridEvent.rename(String gridId, String name) = _Rename; const factory GridEvent.updateDesc(String gridId, String desc) = _Desc; const factory GridEvent.delete(String gridId) = _Delete; const factory GridEvent.createRow() = _CreateRow; + const factory GridEvent.didLoadRows(List rows) = _DidLoadRows; } @freezed abstract class GridState with _$GridState { const factory GridState({ required GridLoadingState loadingState, - required Option> gridInfo, + required Option> fields, + required List rows, + required Option grid, }) = _GridState; factory GridState.initial() => GridState( loadingState: const _Loading(), - gridInfo: none(), + fields: none(), + rows: [], + grid: none(), ); } @@ -113,34 +134,3 @@ class GridLoadingState with _$GridLoadingState { const factory GridLoadingState.loading() = _Loading; const factory GridLoadingState.finish(Either successOrFail) = _Finish; } - -class GridInfo { - List rows; - List fields; - - GridInfo({ - required this.rows, - required this.fields, - }); - - RowInfo rowInfoAtIndex(int index) { - final row = rows[index]; - return RowInfo( - fields: fields, - cellMap: row.cellByFieldId, - ); - } - - int numberOfRows() { - return rows.length; - } -} - -class RowInfo { - List fields; - Map cellMap; - RowInfo({ - required this.fields, - required this.cellMap, - }); -} diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_block_service.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_block_service.dart new file mode 100644 index 0000000000..3672a910f4 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_block_service.dart @@ -0,0 +1,96 @@ +import 'dart:collection'; +import 'package:dartz/dartz.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/dart_notification.pb.dart'; +import 'package:flowy_sdk/rust_stream.dart'; +import 'package:flowy_infra/notifier.dart'; +import 'dart:async'; +import 'dart:typed_data'; +import 'package:app_flowy/core/notification_helper.dart'; + +import 'grid_service.dart'; + +typedef DidLoadRowsCallback = void Function(List); +typedef GridBlockUpdateNotifiedValue = Either; + +class GridBlockService { + String gridId; + List fields; + LinkedHashMap blockMap = LinkedHashMap(); + late GridBlockListener _blockListener; + DidLoadRowsCallback? didLoadRowscallback; + + GridBlockService({required this.gridId, required this.fields, required List gridBlocks}) { + for (final gridBlock in gridBlocks) { + blockMap[gridBlock.blockId] = gridBlock; + } + + _blockListener = GridBlockListener(gridId: gridId); + _blockListener.blockUpdateNotifier.addPublishListener((result) { + result.fold((blockId) { + // + }, (err) => null); + }); + } + + List rows() { + List rows = []; + blockMap.forEach((_, GridBlock gridBlock) { + rows.addAll(gridBlock.rowOrders.map( + (rowOrder) => GridRowData( + gridId: gridId, + fields: fields, + blockId: gridBlock.blockId, + rowId: rowOrder.rowId, + height: rowOrder.height.toDouble(), + ), + )); + }); + return rows; + } + + Future stop() async { + await _blockListener.stop(); + } +} + +class GridBlockListener { + final String gridId; + PublishNotifier blockUpdateNotifier = PublishNotifier(); + StreamSubscription? _subscription; + late GridNotificationParser _parser; + + GridBlockListener({required this.gridId}); + + void start() { + _parser = GridNotificationParser( + id: gridId, + callback: (ty, result) { + _handleObservableType(ty, result); + }, + ); + + _subscription = RustStreamReceiver.listen((observable) => _parser.parse(observable)); + } + + void _handleObservableType(GridNotification ty, Either result) { + switch (ty) { + case GridNotification.GridDidUpdateBlock: + result.fold( + (payload) => blockUpdateNotifier.value = left(GridBlockId.fromBuffer(payload)), + (error) => blockUpdateNotifier.value = right(error), + ); + break; + + default: + break; + } + } + + Future stop() async { + await _subscription?.cancel(); + blockUpdateNotifier.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_listenr.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_listenr.dart new file mode 100644 index 0000000000..55e29d915c --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_listenr.dart @@ -0,0 +1,4 @@ +class GridListener { + void start() {} + Future stop() async {} +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart index 5f7f56fb45..506401706b 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart @@ -3,6 +3,7 @@ import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; import 'package:dartz/dartz.dart'; +import 'package:equatable/equatable.dart'; class GridService { Future> openGrid({required String gridId}) async { @@ -12,22 +13,43 @@ class GridService { return GridEventGetGridData(payload).send(); } - Future> createRow({required String gridId}) { - return GridEventCreateRow(GridId(value: gridId)).send(); + Future> createRow({required String gridId, Option? upperRowId}) { + CreateRowPayload payload = CreateRowPayload.create()..gridId = gridId; + upperRowId?.fold(() => null, (id) => payload.startRowId = id); + return GridEventCreateRow(payload).send(); } - Future> getRows({required String gridId, required RepeatedRowOrder rowOrders}) { - final payload = QueryRowPayload.create() + Future> getGridBlocks( + {required String gridId, required List blockOrders}) { + final payload = QueryGridBlocksPayload.create() ..gridId = gridId - ..rowOrders = rowOrders; - return GridEventGetRows(payload).send(); + ..blockOrders.addAll(blockOrders); + return GridEventGetGridBlocks(payload).send(); } - Future> getFields( - {required String gridId, required RepeatedFieldOrder fieldOrders}) { + Future> getFields({required String gridId, required List fieldOrders}) { final payload = QueryFieldPayload.create() ..gridId = gridId - ..fieldOrders = fieldOrders; + ..fieldOrders = RepeatedFieldOrder(items: fieldOrders); return GridEventGetFields(payload).send(); } } + +class GridRowData extends Equatable { + final String gridId; + final String rowId; + final String blockId; + final List fields; + final double height; + + const GridRowData({ + required this.gridId, + required this.rowId, + required this.blockId, + required this.fields, + required this.height, + }); + + @override + List get props => [rowId]; +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/prelude.dart b/frontend/app_flowy/lib/workspace/application/grid/prelude.dart new file mode 100644 index 0000000000..d28df04c62 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/prelude.dart @@ -0,0 +1,13 @@ +export 'grid_bloc.dart'; +export 'row_bloc.dart'; +export 'row_service.dart'; +export 'grid_service.dart'; +export 'data.dart'; +export 'column_service.dart'; +export 'column_bloc.dart'; +export 'cell_bloc/text_cell_bloc.dart'; +export 'cell_bloc/number_cell_bloc.dart'; +export 'cell_bloc/selection_cell_bloc.dart'; +export 'cell_bloc/date_cell_bloc.dart'; +export 'cell_bloc/checkbox_cell_bloc.dart'; +export 'cell_bloc/cell_service.dart'; diff --git a/frontend/app_flowy/lib/workspace/application/grid/row_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/row_bloc.dart new file mode 100644 index 0000000000..bf13c682d7 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/row_bloc.dart @@ -0,0 +1,113 @@ +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'grid_service.dart'; +import 'row_listener.dart'; +import 'row_service.dart'; + +part 'row_bloc.freezed.dart'; + +class RowBloc extends Bloc { + final RowService rowService; + final RowListener listener; + + RowBloc({required this.rowService, required this.listener}) : super(RowState.initial(rowService.rowData)) { + on( + (event, emit) async { + await event.map( + initial: (_InitialRow value) async { + _startRowListening(); + await _loadCellDatas(emit); + }, + createRow: (_CreateRow value) { + rowService.createRow(); + }, + activeRow: (_ActiveRow value) { + emit(state.copyWith(active: true)); + }, + disactiveRow: (_DisactiveRow value) { + emit(state.copyWith(active: false)); + }, + ); + }, + ); + } + + @override + Future close() async { + await listener.close(); + return super.close(); + } + + Future _startRowListening() async { + listener.updateRowNotifier.addPublishListener((result) { + result.fold((row) { + // + }, (err) => null); + }); + + listener.updateCellNotifier.addPublishListener((result) { + result.fold((repeatedCvell) { + // + Log.info("$repeatedCvell"); + }, (r) => null); + }); + + listener.start(); + } + + Future _loadCellDatas(Emitter emit) async { + final result = await rowService.getRow(); + result.fold( + (row) { + emit(state.copyWith( + cellDatas: makeGridCellDatas(row), + rowHeight: row.height.toDouble(), + )); + }, + (e) => Log.error(e), + ); + } + + List makeGridCellDatas(Row row) { + return rowService.rowData.fields.map((field) { + final cell = row.cellByFieldId[field.id]; + final rowData = rowService.rowData; + + return GridCellData( + rowId: row.id, + gridId: rowData.gridId, + blockId: rowData.blockId, + cell: cell, + field: field, + ); + }).toList(); + } +} + +@freezed +abstract class RowEvent with _$RowEvent { + const factory RowEvent.initial() = _InitialRow; + const factory RowEvent.createRow() = _CreateRow; + const factory RowEvent.activeRow() = _ActiveRow; + const factory RowEvent.disactiveRow() = _DisactiveRow; +} + +@freezed +abstract class RowState with _$RowState { + const factory RowState({ + required String rowId, + required double rowHeight, + required List cellDatas, + required bool active, + }) = _RowState; + + factory RowState.initial(GridRowData data) => RowState( + rowId: data.rowId, + active: false, + rowHeight: data.height, + cellDatas: [], + ); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/row_listener.dart b/frontend/app_flowy/lib/workspace/application/grid/row_listener.dart new file mode 100644 index 0000000000..76a2ba617d --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/row_listener.dart @@ -0,0 +1,54 @@ +import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/dart_notification.pb.dart'; +import 'package:flowy_sdk/rust_stream.dart'; +import 'package:flowy_infra/notifier.dart'; +import 'dart:async'; +import 'dart:typed_data'; +import 'package:app_flowy/core/notification_helper.dart'; +import 'package:dartz/dartz.dart'; + +typedef UpdateCellNotifiedValue = Either; +typedef UpdateRowNotifiedValue = Either; + +class RowListener { + final String rowId; + PublishNotifier updateCellNotifier = PublishNotifier(); + PublishNotifier updateRowNotifier = PublishNotifier(); + StreamSubscription? _subscription; + late GridNotificationParser _parser; + + RowListener({required this.rowId}); + + void start() { + _parser = GridNotificationParser( + id: rowId, + callback: (ty, result) { + _handleObservableType(ty, result); + }, + ); + + _subscription = RustStreamReceiver.listen((observable) => _parser.parse(observable)); + } + + void _handleObservableType(GridNotification ty, Either result) { + switch (ty) { + case GridNotification.GridDidUpdateCells: + result.fold( + (payload) => updateCellNotifier.value = left(RepeatedCell.fromBuffer(payload)), + (error) => updateCellNotifier.value = right(error), + ); + break; + + default: + break; + } + } + + Future close() async { + await _subscription?.cancel(); + updateCellNotifier.dispose(); + updateRowNotifier.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/row_service.dart b/frontend/app_flowy/lib/workspace/application/grid/row_service.dart new file mode 100644 index 0000000000..013ae3fb1c --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/row_service.dart @@ -0,0 +1,45 @@ +import 'package:dartz/dartz.dart'; +import 'package:flowy_sdk/dispatch/dispatch.dart'; +import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; + +import 'grid_service.dart'; + +class RowService { + final GridRowData rowData; + + RowService(this.rowData); + + Future> createRow() { + CreateRowPayload payload = CreateRowPayload.create() + ..gridId = rowData.gridId + ..startRowId = rowData.rowId; + + return GridEventCreateRow(payload).send(); + } + + Future> getRow() { + QueryRowPayload payload = QueryRowPayload.create() + ..gridId = rowData.gridId + ..blockId = rowData.blockId + ..rowId = rowData.rowId; + + return GridEventGetRow(payload).send(); + } +} + +class GridCellData { + final String gridId; + final String rowId; + final String blockId; + final Field field; + final Cell? cell; + + GridCellData({ + required this.rowId, + required this.gridId, + required this.blockId, + required this.field, + required this.cell, + }); +} diff --git a/frontend/app_flowy/lib/workspace/application/home/prelude.dart b/frontend/app_flowy/lib/workspace/application/home/prelude.dart new file mode 100644 index 0000000000..8d1173c2d6 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/home/prelude.dart @@ -0,0 +1 @@ +export 'home_listen_bloc.dart'; diff --git a/frontend/app_flowy/lib/workspace/application/menu/prelude.dart b/frontend/app_flowy/lib/workspace/application/menu/prelude.dart new file mode 100644 index 0000000000..0bf94ea60b --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/menu/prelude.dart @@ -0,0 +1,2 @@ +export 'menu_bloc.dart'; +export 'menu_user_bloc.dart'; diff --git a/frontend/app_flowy/lib/workspace/application/trash/prelude.dart b/frontend/app_flowy/lib/workspace/application/trash/prelude.dart new file mode 100644 index 0000000000..5a638a58d1 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/trash/prelude.dart @@ -0,0 +1,3 @@ +export 'trash_bloc.dart'; +export 'trash_listener.dart'; +export 'trash_service.dart'; diff --git a/frontend/app_flowy/lib/workspace/application/view/prelude.dart b/frontend/app_flowy/lib/workspace/application/view/prelude.dart new file mode 100644 index 0000000000..f789b90fcd --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/view/prelude.dart @@ -0,0 +1,3 @@ +export 'view_bloc.dart'; +export 'view_listener.dart'; +export 'view_service.dart'; diff --git a/frontend/app_flowy/lib/workspace/application/view/view_listener.dart b/frontend/app_flowy/lib/workspace/application/view/view_listener.dart index c5a202e25e..f400124805 100644 --- a/frontend/app_flowy/lib/workspace/application/view/view_listener.dart +++ b/frontend/app_flowy/lib/workspace/application/view/view_listener.dart @@ -9,15 +9,15 @@ import 'package:flowy_sdk/protobuf/flowy-folder/dart_notification.pb.dart'; import 'package:flowy_sdk/rust_stream.dart'; import 'package:flowy_infra/notifier.dart'; -typedef DeleteNotifierValue = Either; -typedef UpdateNotifierValue = Either; -typedef RestoreNotifierValue = Either; +typedef DeleteViewNotifyValue = Either; +typedef UpdateViewNotifiedValue = Either; +typedef RestoreViewNotifiedValue = Either; class ViewListener { StreamSubscription? _subscription; - PublishNotifier updatedNotifier = PublishNotifier(); - PublishNotifier deletedNotifier = PublishNotifier(); - PublishNotifier restoredNotifier = PublishNotifier(); + PublishNotifier updatedNotifier = PublishNotifier(); + PublishNotifier deletedNotifier = PublishNotifier(); + PublishNotifier restoredNotifier = PublishNotifier(); late FolderNotificationParser _parser; View view; diff --git a/frontend/app_flowy/lib/workspace/application/workspace/prelude.dart b/frontend/app_flowy/lib/workspace/application/workspace/prelude.dart new file mode 100644 index 0000000000..129462beb0 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/workspace/prelude.dart @@ -0,0 +1,3 @@ +export 'welcome_bloc.dart'; +export 'workspace_listener.dart'; +export 'workspace_service.dart'; diff --git a/frontend/app_flowy/lib/workspace/presentation/home/home_stack.dart b/frontend/app_flowy/lib/workspace/presentation/home/home_stack.dart index 8e249ab9c5..65e315f56d 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/home_stack.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/home_stack.dart @@ -168,7 +168,7 @@ class HomeStackManager { index: getIt().indexOf(notifier.plugin.ty), children: getIt().supportPluginTypes.map((pluginType) { if (pluginType == notifier.plugin.ty) { - return notifier.plugin.display.buildWidget(); + return notifier.plugin.display.buildWidget().padding(horizontal: 40, vertical: 28); } else { return const BlankPage(); } diff --git a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/header.dart b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/header.dart index 58ebabc0c2..da20eafc7b 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/header.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/header.dart @@ -37,7 +37,7 @@ class MenuAppHeader extends StatelessWidget { _renderExpandedIcon(context, theme), // HSpace(MenuAppSizes.iconPadding), _renderTitle(context, theme), - _renderAddButton(context), + _renderCreateViewButton(context), ], ), ); @@ -99,7 +99,7 @@ class MenuAppHeader extends StatelessWidget { ); } - Widget _renderAddButton(BuildContext context) { + Widget _renderCreateViewButton(BuildContext context) { return Tooltip( message: LocaleKeys.menuAppHeader_addPageTooltip.tr(), child: AddButton( diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/document.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/document.dart index 53e0bf58aa..048f417de0 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/document.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/document.dart @@ -50,7 +50,7 @@ class DocumentPluginBuilder extends PluginBuilder { PluginType get pluginType => DefaultPlugin.quill.type(); @override - ViewDataType get dataType => ViewDataType.Block; + ViewDataType get dataType => ViewDataType.TextBlock; } class DocumentPlugin implements Plugin { @@ -141,6 +141,7 @@ class _DocumentLeftBarItemState extends State { @override void dispose() { _controller.dispose(); + _focusNode.removeListener(_handleFocusChanged); _focusNode.dispose(); super.dispose(); } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/document_page.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/document_page.dart index 30b88e652f..031edb93fd 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/document_page.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/document_page.dart @@ -10,7 +10,6 @@ import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:provider/provider.dart'; -import 'package:styled_widget/styled_widget.dart'; import 'styles.dart'; import 'widget/banner.dart'; @@ -82,7 +81,7 @@ class _DocumentPageState extends State { _renderToolbar(controller), const VSpace(10), ], - ).padding(horizontal: 40, top: 28), + ), ), ], ); diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart index e53a2f01e2..4e7747ac1d 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart @@ -40,7 +40,7 @@ class _GridPageState extends State { return state.loadingState.map( loading: (_) => const Center(child: CircularProgressIndicator.adaptive()), finish: (result) => result.successOrFail.fold( - (_) => const GridBody(), + (_) => const FlowyGrid(), (err) => FlowyErrorPage(err.toString()), ), ); @@ -65,14 +65,14 @@ class _GridPageState extends State { } } -class GridBody extends StatefulWidget { - const GridBody({Key? key}) : super(key: key); +class FlowyGrid extends StatefulWidget { + const FlowyGrid({Key? key}) : super(key: key); @override - _GridBodyState createState() => _GridBodyState(); + _FlowyGridState createState() => _FlowyGridState(); } -class _GridBodyState extends State { +class _FlowyGridState extends State { final _scrollController = GridScrollController(); @override @@ -85,32 +85,29 @@ class _GridBodyState extends State { Widget build(BuildContext context) { return BlocBuilder( builder: (context, state) { - return state.gridInfo.fold( + return state.fields.fold( () => const Center(child: CircularProgressIndicator.adaptive()), - (some) => some.fold( - (gridInfo) => _renderGrid(context, gridInfo), - (err) => FlowyErrorPage(err.toString()), - ), + (fields) => _renderGrid(context, fields), ); }, ); } - Widget _renderGrid(BuildContext context, GridInfo gridInfo) { + Widget _renderGrid(BuildContext context, List fields) { return Stack( children: [ StyledSingleChildScrollView( controller: _scrollController.horizontalController, axis: Axis.horizontal, child: SizedBox( - width: GridLayout.headerWidth(gridInfo.fields), + width: GridLayout.headerWidth(fields), child: CustomScrollView( physics: StyledScrollPhysics(), controller: _scrollController.verticalController, slivers: [ - _buildHeader(gridInfo.fields), - _buildRows(gridInfo), - _builderFooter(context), + _buildHeader(fields), + _buildRows(context), + const GridFooter(), ], ), ), @@ -133,20 +130,16 @@ class _GridBodyState extends State { ); } - Widget _buildRows(GridInfo gridInfo) { + Widget _buildRows(BuildContext context) { return SliverList( - delegate: SliverChildBuilderDelegate((context, index) { - final rowInfo = gridInfo.rowInfoAtIndex(index); - return RepaintBoundary(child: GridRowWidget(rowInfo)); - }, childCount: gridInfo.numberOfRows()), - ); - } - - Widget _builderFooter(BuildContext context) { - return GridFooter( - onAddRow: () { - context.read().add(const GridEvent.createRow()); - }, + delegate: SliverChildBuilderDelegate( + (context, index) { + final rowData = context.read().state.rows[index]; + return GridRowWidget(data: rowData); + }, + childCount: context.read().state.rows.length, + addRepaintBoundaries: true, + ), ); } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/layout.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/layout.dart index a44ad20d39..3f076fc89f 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/layout.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/layout.dart @@ -8,6 +8,6 @@ class GridLayout { final fieldsWidth = fields.map((field) => field.width.toDouble()).reduce((value, element) => value + element); - return fieldsWidth + GridSize.firstHeaderPadding; + return fieldsWidth + GridSize.leadingHeaderPadding + GridSize.trailHeaderPadding; } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/sizes.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/sizes.dart index e833df5cc4..5f8f94e1a2 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/sizes.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/sizes.dart @@ -1,16 +1,30 @@ -class GridInsets { - static double scale = 1; - - static double get horizontal => 6 * scale; - static double get vertical => 6 * scale; -} +import 'package:flutter/widgets.dart'; class GridSize { static double scale = 1; static double get scrollBarSize => 12 * scale; - static double get headerHeight => 50 * scale; - static double get rowHeight => 50 * scale; + static double get headerHeight => 40 * scale; static double get footerHeight => 40 * scale; - static double get firstHeaderPadding => 20 * scale; + static double get leadingHeaderPadding => 30 * scale; + static double get trailHeaderPadding => 140 * scale; + static double get headerContentPadding => 8 * scale; + static double get cellContentPadding => 8 * scale; + + // + static EdgeInsets get headerContentInsets => EdgeInsets.symmetric( + horizontal: GridSize.headerContentPadding, + vertical: GridSize.headerContentPadding, + ); + static EdgeInsets get cellContentInsets => EdgeInsets.symmetric( + horizontal: GridSize.cellContentPadding, + vertical: GridSize.cellContentPadding, + ); + + static EdgeInsets get footerContentInsets => EdgeInsets.fromLTRB( + 0, + GridSize.headerContentPadding, + GridSize.headerContentPadding, + GridSize.headerContentPadding, + ); } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_builder.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_builder.dart index 1c02664c86..187a81c1bc 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_builder.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_builder.dart @@ -1,17 +1,36 @@ -import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; -import 'grid_cell.dart'; +import 'package:app_flowy/workspace/application/grid/row_service.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/meta.pb.dart'; +import 'package:flutter/widgets.dart'; +import 'checkbox_cell.dart'; +import 'date_cell.dart'; +import 'number_cell.dart'; +import 'selection_cell.dart'; +import 'text_cell.dart'; -class GridCellBuilder { - static GridCellWidget buildCell(Field? field, Cell? cell) { - if (field == null || cell == null) { +Widget buildGridCell(GridCellData cellData) { + switch (cellData.field.fieldType) { + case FieldType.Checkbox: + return CheckboxCell(cellData: cellData); + case FieldType.DateTime: + return DateCell(cellData: cellData); + case FieldType.MultiSelect: + return MultiSelectCell(cellContext: cellData); + case FieldType.Number: + return NumberCell(cellData: cellData); + case FieldType.RichText: + return GridTextCell(cellData: cellData); + case FieldType.SingleSelect: + return SingleSelectCell(cellContext: cellData); + default: return const BlankCell(); - } - - switch (field.fieldType) { - case FieldType.RichText: - return GridTextCell(cell.content); - default: - return const BlankCell(); - } + } +} + +class BlankCell extends StatelessWidget { + const BlankCell({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_container.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_container.dart index edd0de5076..0bfcc10caa 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_container.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_container.dart @@ -1,32 +1,38 @@ import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; -import 'package:flowy_infra_ui/widget/mouse_hover_builder.dart'; +import 'package:flowy_infra/theme.dart'; import 'package:flutter/material.dart'; -import 'cell_decoration.dart'; -import 'grid_cell.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; -class CellContainer extends StatelessWidget { - final GridCellWidget child; +class CellContainer extends StatefulWidget { + final Widget child; final double width; - const CellContainer({Key? key, required this.child, required this.width}) : super(key: key); + const CellContainer({ + Key? key, + required this.child, + required this.width, + }) : super(key: key); + @override + State createState() => _CellContainerState(); +} + +class _CellContainerState extends State { @override Widget build(BuildContext context) { + final theme = context.watch(); + final borderSide = BorderSide(color: theme.shader4, width: 0.4); return GestureDetector( behavior: HitTestBehavior.translucent, - onTap: () { - // context - // .read() - // .add(HomeEvent.setEditPannel(CellEditPannelContext())); - }, - child: MouseHoverBuilder( - builder: (_, isHovered) => Container( - width: width, - decoration: CellDecoration.box( - color: isHovered ? Colors.red.withOpacity(.1) : Colors.transparent, - ), - padding: EdgeInsets.symmetric(vertical: GridInsets.vertical, horizontal: GridInsets.horizontal), - child: child, + onTap: () {}, + child: Container( + constraints: BoxConstraints( + maxWidth: widget.width, ), + decoration: BoxDecoration( + border: Border(right: borderSide, bottom: borderSide), + ), + padding: GridSize.cellContentInsets, + child: Center(child: IntrinsicHeight(child: widget.child)), ), ); } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/checkbox_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/checkbox_cell.dart new file mode 100644 index 0000000000..eec381914a --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/checkbox_cell.dart @@ -0,0 +1,45 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart'; +import 'package:app_flowy/workspace/application/grid/row_service.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class CheckboxCell extends StatefulWidget { + final GridCellData cellData; + + const CheckboxCell({ + required this.cellData, + Key? key, + }) : super(key: key); + + @override + State createState() => _CheckboxCellState(); +} + +class _CheckboxCellState extends State { + late CheckboxCellBloc _cellBloc; + + @override + void initState() { + _cellBloc = getIt(param1: widget.cellData); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return BlocProvider.value( + value: _cellBloc, + child: BlocBuilder( + builder: (context, state) { + return Container(); + }, + ), + ); + } + + @override + Future dispose() async { + _cellBloc.close(); + super.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/date_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/date_cell.dart new file mode 100644 index 0000000000..5d9f452c78 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/date_cell.dart @@ -0,0 +1,45 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/cell_bloc/date_cell_bloc.dart'; +import 'package:app_flowy/workspace/application/grid/row_service.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class DateCell extends StatefulWidget { + final GridCellData cellData; + + const DateCell({ + required this.cellData, + Key? key, + }) : super(key: key); + + @override + State createState() => _DateCellState(); +} + +class _DateCellState extends State { + late DateCellBloc _cellBloc; + + @override + void initState() { + _cellBloc = getIt(param1: widget.cellData); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return BlocProvider.value( + value: _cellBloc, + child: BlocBuilder( + builder: (context, state) { + return Container(); + }, + ), + ); + } + + @override + Future dispose() async { + _cellBloc.close(); + super.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/grid_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/grid_cell.dart deleted file mode 100755 index 00e6fad6af..0000000000 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/grid_cell.dart +++ /dev/null @@ -1,100 +0,0 @@ -import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; -import 'package:flowy_infra_ui/widget/mouse_hover_builder.dart'; -import 'package:flutter/material.dart'; - -import 'cell_decoration.dart'; -// ignore: import_of_legacy_library_into_null_safe - -/// The interface of base cell. -abstract class GridCellWidget extends StatelessWidget { - final canSelect = true; - - const GridCellWidget({Key? key}) : super(key: key); -} - -class GridTextCell extends GridCellWidget { - final String content; - const GridTextCell(this.content, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Text(content); - } -} - -class DateCell extends GridCellWidget { - final String content; - const DateCell(this.content, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Text(content); - } -} - -class NumberCell extends GridCellWidget { - final String content; - const NumberCell(this.content, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Text(content); - } -} - -class SingleSelectCell extends GridCellWidget { - final String content; - const SingleSelectCell(this.content, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Text(content); - } -} - -class MultiSelectCell extends GridCellWidget { - final String content; - const MultiSelectCell(this.content, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Text(content); - } -} - -class BlankCell extends GridCellWidget { - const BlankCell({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container(); - } -} - -class RowLeading extends StatelessWidget { - const RowLeading({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - // return Expanded( - // child: Container( - // color: Colors.white10, - // width: GridSize.firstHeaderPadding, - // ), - // ); - - return GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () {}, - child: MouseHoverBuilder( - builder: (_, isHovered) => Container( - width: GridSize.firstHeaderPadding, - decoration: CellDecoration.box( - color: isHovered ? Colors.red.withOpacity(.1) : Colors.white, - ), - padding: EdgeInsets.symmetric(vertical: GridInsets.vertical, horizontal: GridInsets.horizontal), - ), - ), - ); - } -} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/grid_row.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/grid_row.dart index 4d5da03423..f062202744 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/grid_row.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/grid_row.dart @@ -1,62 +1,145 @@ -import 'package:app_flowy/workspace/application/grid/grid_bloc.dart'; +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/prelude.dart'; import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; -import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' hide Row; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/icon_button.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'cell_builder.dart'; import 'cell_container.dart'; -import 'grid_cell.dart'; -class GridRowContext { - final RepeatedFieldOrder fieldOrders; - final Map fieldById; - final Map cellByFieldId; - GridRowContext(this.fieldOrders, this.fieldById, this.cellByFieldId); +class GridRowWidget extends StatefulWidget { + final GridRowData data; + GridRowWidget({required this.data, Key? key}) : super(key: ObjectKey(data.rowId)); + + @override + State createState() => _GridRowWidgetState(); } -class GridRowWidget extends StatelessWidget { - final RowInfo rowInfo; - final Function(bool)? onHoverChange; - const GridRowWidget(this.rowInfo, {Key? key, this.onHoverChange}) : super(key: key); +class _GridRowWidgetState extends State { + late RowBloc _rowBloc; + + @override + void initState() { + _rowBloc = getIt(param1: widget.data)..add(const RowEvent.initial()); + super.initState(); + } @override Widget build(BuildContext context) { - return SizedBox( - height: GridSize.rowHeight, - child: _buildRowBody(), + return BlocProvider.value( + value: _rowBloc, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + child: MouseRegion( + cursor: SystemMouseCursors.click, + onEnter: (p) => _rowBloc.add(const RowEvent.activeRow()), + onExit: (p) => _rowBloc.add(const RowEvent.disactiveRow()), + child: BlocBuilder( + buildWhen: (p, c) => p.rowHeight != c.rowHeight, + builder: (context, state) { + return SizedBox( + height: _rowBloc.state.rowHeight, + child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const LeadingRow(), + _buildCells(), + const TrailingRow(), + ], + ), + ); + }, + ), + ), + ), ); } - Widget _buildRowBody() { - Widget rowWidget = Row( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: _buildCells(), - ); - - if (onHoverChange != null) { - rowWidget = MouseRegion( - onEnter: (event) => onHoverChange!(true), - onExit: (event) => onHoverChange!(false), - cursor: MouseCursor.uncontrolled, - child: rowWidget, - ); - } - - return rowWidget; + @override + Future dispose() async { + _rowBloc.close(); + super.dispose(); } - List _buildCells() { - var cells = List.empty(growable: true); - cells.add(const RowLeading()); - - for (var field in rowInfo.fields) { - final data = rowInfo.cellMap[field.id]; - final cell = CellContainer( - width: field.width.toDouble(), - child: GridCellBuilder.buildCell(field, data), - ); - - cells.add(cell); - } - return cells; + Widget _buildCells() { + return BlocBuilder( + buildWhen: (p, c) => p.cellDatas != c.cellDatas, + builder: (context, state) { + return Row( + children: state.cellDatas + .map( + (cellData) => CellContainer( + width: cellData.field.width.toDouble(), + child: buildGridCell(cellData), + ), + ) + .toList(), + ); + }, + ); + } +} + +class LeadingRow extends StatelessWidget { + const LeadingRow({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocSelector( + selector: (state) => state.active, + builder: (context, isActive) { + return SizedBox( + width: GridSize.leadingHeaderPadding, + child: isActive + ? Row( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + AppendRowButton(), + ], + ) + : null, + ); + }, + ); + } +} + +class TrailingRow extends StatelessWidget { + const TrailingRow({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + final borderSide = BorderSide(color: theme.shader4, width: 0.4); + + return BlocBuilder( + builder: (context, state) { + return Container( + width: GridSize.trailHeaderPadding, + decoration: BoxDecoration( + border: Border(bottom: borderSide), + ), + padding: GridSize.cellContentInsets, + ); + }, + ); + } +} + +class AppendRowButton extends StatelessWidget { + const AppendRowButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return FlowyIconButton( + hoverColor: theme.hover, + width: 22, + onPressed: () => context.read().add(const RowEvent.createRow()), + iconPadding: const EdgeInsets.all(3), + icon: svg("home/add"), + ); } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/number_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/number_cell.dart new file mode 100644 index 0000000000..ea3f70fed3 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/number_cell.dart @@ -0,0 +1,45 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/cell_bloc/number_cell_bloc.dart'; +import 'package:app_flowy/workspace/application/grid/row_service.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class NumberCell extends StatefulWidget { + final GridCellData cellData; + + const NumberCell({ + required this.cellData, + Key? key, + }) : super(key: key); + + @override + State createState() => _NumberCellState(); +} + +class _NumberCellState extends State { + late NumberCellBloc _cellBloc; + + @override + void initState() { + _cellBloc = getIt(param1: widget.cellData); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return BlocProvider.value( + value: _cellBloc, + child: BlocBuilder( + builder: (context, state) { + return Container(); + }, + ), + ); + } + + @override + Future dispose() async { + await _cellBloc.close(); + super.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/selection_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/selection_cell.dart new file mode 100644 index 0000000000..94891924cd --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/selection_cell.dart @@ -0,0 +1,70 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/prelude.dart'; +import 'package:flutter/material.dart'; + +class SingleSelectCell extends StatefulWidget { + final GridCellData cellContext; + + const SingleSelectCell({ + required this.cellContext, + Key? key, + }) : super(key: key); + + @override + State createState() => _SingleSelectCellState(); +} + +class _SingleSelectCellState extends State { + late SelectionCellBloc _cellBloc; + + @override + void initState() { + _cellBloc = getIt(param1: widget.cellContext); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container(); + } + + @override + Future dispose() async { + _cellBloc.close(); + super.dispose(); + } +} + +//---------------------------------------------------------------- +class MultiSelectCell extends StatefulWidget { + final GridCellData cellContext; + + const MultiSelectCell({ + required this.cellContext, + Key? key, + }) : super(key: key); + + @override + State createState() => _MultiSelectCellState(); +} + +class _MultiSelectCellState extends State { + late SelectionCellBloc _cellBloc; + + @override + void initState() { + _cellBloc = getIt(param1: widget.cellContext); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container(); + } + + @override + Future dispose() async { + _cellBloc.close(); + super.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/text_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/text_cell.dart new file mode 100644 index 0000000000..71ab0c41bd --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/text_cell.dart @@ -0,0 +1,67 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/cell_bloc/text_cell_bloc.dart'; +import 'package:app_flowy/workspace/application/grid/row_service.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +/// The interface of base cell. + +class GridTextCell extends StatefulWidget { + final GridCellData cellData; + const GridTextCell({ + required this.cellData, + Key? key, + }) : super(key: key); + + @override + State createState() => _GridTextCellState(); +} + +class _GridTextCellState extends State { + late TextEditingController _controller; + final _focusNode = FocusNode(); + late TextCellBloc _cellBloc; + + @override + void initState() { + _cellBloc = getIt(param1: widget.cellData); + _controller = TextEditingController(text: _cellBloc.state.content); + _focusNode.addListener(_focusChanged); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return BlocProvider.value( + value: _cellBloc, + child: BlocBuilder( + builder: (context, state) { + return TextField( + controller: _controller, + focusNode: _focusNode, + onChanged: (value) {}, + maxLines: 1, + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), + decoration: const InputDecoration( + contentPadding: EdgeInsets.zero, + border: InputBorder.none, + isDense: true, + ), + ); + }, + ), + ); + } + + @override + Future dispose() async { + _cellBloc.close(); + _focusNode.removeListener(_focusChanged); + _focusNode.dispose(); + super.dispose(); + } + + void _focusChanged() { + _cellBloc.add(TextCellEvent.updateText(_controller.text)); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/footer/grid_footer.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/footer/grid_footer.dart index cdbb0d6e51..69e27a0fc4 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/footer/grid_footer.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/footer/grid_footer.dart @@ -1,47 +1,45 @@ +import 'package:app_flowy/workspace/application/grid/grid_bloc.dart'; import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; -import 'package:flowy_infra_ui/widget/mouse_hover_builder.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/button.dart'; +import 'package:flowy_infra_ui/style_widget/text.dart'; import 'package:flutter/material.dart'; - -import '../content/cell_decoration.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; class GridFooter extends StatelessWidget { - final VoidCallback? onAddRow; - const GridFooter({Key? key, required this.onAddRow}) : super(key: key); + const GridFooter({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return SliverToBoxAdapter( child: SizedBox( height: GridSize.footerHeight, - child: Row( - children: [ - AddRowButton(onTap: onAddRow), - ], + child: Padding( + padding: GridSize.headerContentInsets, + child: Row( + children: [ + SizedBox(width: GridSize.leadingHeaderPadding), + const SizedBox(width: 120, child: _AddRowButton()), + ], + ), ), ), ); } } -class AddRowButton extends StatelessWidget { - final VoidCallback? onTap; - const AddRowButton({Key? key, required this.onTap}) : super(key: key); +class _AddRowButton extends StatelessWidget { + const _AddRowButton({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - return GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: onTap, - child: MouseHoverBuilder( - builder: (_, isHovered) => Container( - width: GridSize.firstHeaderPadding, - height: GridSize.footerHeight, - decoration: CellDecoration.box( - color: isHovered ? Colors.red.withOpacity(.1) : Colors.white, - ), - child: const Icon(Icons.add, size: 16), - ), - ), + final theme = context.watch(); + return FlowyButton( + text: const FlowyText.medium('New row', fontSize: 12), + hoverColor: theme.hover, + onTap: () => context.read().add(const GridEvent.createRow()), + icon: svg("home/add"), ); } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header.dart index 9f894f8ee5..83d24535f4 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header.dart @@ -1,6 +1,13 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/column_bloc.dart'; import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/button.dart'; +import 'package:flowy_infra_ui/style_widget/text.dart'; import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' hide Row; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'header_cell.dart'; @@ -31,30 +38,77 @@ class GridHeaderDelegate extends SliverPersistentHeaderDelegate { class GridHeader extends StatelessWidget { final List fields; - const GridHeader({required this.fields, Key? key}) : super(key: key); @override Widget build(BuildContext context) { - final headers = List.empty(growable: true); - fields.asMap().forEach((index, field) { - final header = HeaderCellContainer( - width: field.width.toDouble(), - child: HeaderCell( - field, - ), - ); + return BlocProvider( + create: (context) => getIt(param1: fields)..add(const ColumnEvent.initial()), + child: BlocBuilder( + builder: (context, state) { + final headers = state.fields + .map( + (field) => HeaderCellContainer( + width: field.width.toDouble(), + child: HeaderCell(field), + ), + ) + .toList(); - // - headers.add(header); - }); - - return Row( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const HeaderCellLeading(), - ...headers, - ], + return Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const LeadingHeaderCell(), + ...headers, + const TrailingHeaderCell(), + ], + ); + }, + ), + ); + } +} + +class LeadingHeaderCell extends StatelessWidget { + const LeadingHeaderCell({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: GridSize.leadingHeaderPadding, + ); + } +} + +class TrailingHeaderCell extends StatelessWidget { + const TrailingHeaderCell({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + final borderSide = BorderSide(color: theme.shader4, width: 0.4); + return Container( + width: GridSize.trailHeaderPadding, + decoration: BoxDecoration( + border: Border(top: borderSide, bottom: borderSide), + ), + padding: GridSize.headerContentInsets, + child: const CreateColumnButton(), + ); + } +} + +class CreateColumnButton extends StatelessWidget { + const CreateColumnButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return FlowyButton( + text: const FlowyText.medium('New column', fontSize: 12), + hoverColor: theme.hover, + onTap: () => context.read().add(const ColumnEvent.createColumn()), + icon: svg("home/add"), ); } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header_cell.dart index 4148f1e041..aacdcd251e 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header_cell.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header_cell.dart @@ -1,7 +1,10 @@ import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/button.dart'; +import 'package:flowy_infra_ui/style_widget/text.dart'; import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; import 'package:flutter/material.dart'; -import 'constants.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; class HeaderCell extends StatelessWidget { final Field field; @@ -9,9 +12,11 @@ class HeaderCell extends StatelessWidget { @override Widget build(BuildContext context) { - return Text( - field.name, - style: const TextStyle(fontSize: 15.0, color: Colors.black), + final theme = context.watch(); + return FlowyButton( + text: FlowyText.medium(field.name, fontSize: 12), + hoverColor: theme.hover, + onTap: () {}, ); } } @@ -23,30 +28,15 @@ class HeaderCellContainer extends StatelessWidget { @override Widget build(BuildContext context) { - return GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () {}, - child: Container( - width: width, - decoration: BoxDecoration( - border: Border.all(color: Colors.black26, width: 0.5), - color: GridHeaderConstants.backgroundColor, - ), - padding: EdgeInsets.symmetric(vertical: GridInsets.vertical, horizontal: GridInsets.horizontal), - child: child, - ), - ); - } -} - -class HeaderCellLeading extends StatelessWidget { - const HeaderCellLeading({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { + final theme = context.watch(); + final borderSide = BorderSide(color: theme.shader4, width: 0.4); return Container( - width: GridSize.firstHeaderPadding, - color: GridHeaderConstants.backgroundColor, + width: width, + decoration: BoxDecoration( + border: Border(top: borderSide, right: borderSide, bottom: borderSide), + ), + padding: GridSize.headerContentInsets, + child: child, ); } } diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart index 6b67081ca2..b7d8ea4e88 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart @@ -24,7 +24,7 @@ class FlowyButton extends StatelessWidget { return InkWell( onTap: onTap, child: FlowyHover( - config: HoverDisplayConfig(borderRadius: Corners.s6Border, hoverColor: hoverColor), + config: HoverDisplayConfig(borderRadius: Corners.s5Border, hoverColor: hoverColor), builder: (context, onHover) => _render(), ), ); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-grid/dart_event.dart b/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-grid/dart_event.dart index b62b350f5e..c13b12e687 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-grid/dart_event.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-grid/dart_event.dart @@ -18,18 +18,18 @@ class GridEventGetGridData { } } -class GridEventGetRows { - QueryRowPayload request; - GridEventGetRows(this.request); +class GridEventGetGridBlocks { + QueryGridBlocksPayload request; + GridEventGetGridBlocks(this.request); - Future> send() { + Future> send() { final request = FFIRequest.create() - ..event = GridEvent.GetRows.toString() + ..event = GridEvent.GetGridBlocks.toString() ..payload = requestToBytes(this.request); return Dispatch.asyncRequest(request) .then((bytesResult) => bytesResult.fold( - (okBytes) => left(RepeatedRow.fromBuffer(okBytes)), + (okBytes) => left(RepeatedGridBlock.fromBuffer(okBytes)), (errBytes) => right(FlowyError.fromBuffer(errBytes)), )); } @@ -53,12 +53,46 @@ class GridEventGetFields { } class GridEventCreateRow { - GridId request; + CreateRowPayload request; GridEventCreateRow(this.request); + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.CreateRow.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (okBytes) => left(Row.fromBuffer(okBytes)), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + +class GridEventGetRow { + QueryRowPayload request; + GridEventGetRow(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.GetRow.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (okBytes) => left(Row.fromBuffer(okBytes)), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + +class GridEventUpdateCell { + CellMetaChangeset request; + GridEventUpdateCell(this.request); + Future> send() { final request = FFIRequest.create() - ..event = GridEvent.CreateRow.toString() + ..event = GridEvent.UpdateCell.toString() ..payload = requestToBytes(this.request); return Dispatch.asyncRequest(request) diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart b/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart index f26efb17e4..715b9b2f4f 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart @@ -22,7 +22,6 @@ import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart'; import 'package:flowy_sdk/protobuf/dart-ffi/protobuf.dart'; import 'package:flowy_sdk/protobuf/flowy-folder-data-model/protobuf.dart'; import 'package:flowy_sdk/protobuf/flowy-block/protobuf.dart'; -import 'package:flowy_sdk/protobuf/flowy-collaboration/protobuf.dart'; import 'package:flowy_sdk/protobuf/flowy-grid-data-model/protobuf.dart'; // ignore: unused_import diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/protobuf.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/protobuf.dart index 050f20adc0..78a7a563db 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/protobuf.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/protobuf.dart @@ -1,5 +1,5 @@ // Auto-generated, do not edit export './folder_info.pb.dart'; export './ws_data.pb.dart'; +export './text_block_info.pb.dart'; export './revision.pb.dart'; -export './document_info.pb.dart'; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/revision.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/revision.pbenum.dart index 4c2ae91cea..f3c7efb417 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/revision.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/revision.pbenum.dart @@ -9,21 +9,6 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -class RevisionState extends $pb.ProtobufEnum { - static const RevisionState Sync = RevisionState._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Sync'); - static const RevisionState Ack = RevisionState._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Ack'); - - static const $core.List values = [ - Sync, - Ack, - ]; - - static final $core.Map<$core.int, RevisionState> _byValue = $pb.ProtobufEnum.initByValue(values); - static RevisionState? valueOf($core.int value) => _byValue[value]; - - const RevisionState._($core.int v, $core.String n) : super(v, n); -} - class RevType extends $pb.ProtobufEnum { static const RevType DeprecatedLocal = RevType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DeprecatedLocal'); static const RevType DeprecatedRemote = RevType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DeprecatedRemote'); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/revision.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/revision.pbjson.dart index 64a4feed7e..5d4db67b74 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/revision.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/revision.pbjson.dart @@ -8,17 +8,6 @@ import 'dart:core' as $core; import 'dart:convert' as $convert; import 'dart:typed_data' as $typed_data; -@$core.Deprecated('Use revisionStateDescriptor instead') -const RevisionState$json = const { - '1': 'RevisionState', - '2': const [ - const {'1': 'Sync', '2': 0}, - const {'1': 'Ack', '2': 1}, - ], -}; - -/// Descriptor for `RevisionState`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List revisionStateDescriptor = $convert.base64Decode('Cg1SZXZpc2lvblN0YXRlEggKBFN5bmMQABIHCgNBY2sQAQ=='); @$core.Deprecated('Use revTypeDescriptor instead') const RevType$json = const { '1': 'RevType', diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pb.dart new file mode 100644 index 0000000000..43d315d340 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pb.dart @@ -0,0 +1,412 @@ +/// +// Generated code. Do not modify. +// source: text_block_info.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +import 'package:fixnum/fixnum.dart' as $fixnum; +import 'package:protobuf/protobuf.dart' as $pb; + +import 'revision.pb.dart' as $0; + +class CreateTextBlockParams extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CreateTextBlockParams', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') + ..aOM<$0.RepeatedRevision>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'revisions', subBuilder: $0.RepeatedRevision.create) + ..hasRequiredFields = false + ; + + CreateTextBlockParams._() : super(); + factory CreateTextBlockParams({ + $core.String? id, + $0.RepeatedRevision? revisions, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (revisions != null) { + _result.revisions = revisions; + } + return _result; + } + factory CreateTextBlockParams.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CreateTextBlockParams.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CreateTextBlockParams clone() => CreateTextBlockParams()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CreateTextBlockParams copyWith(void Function(CreateTextBlockParams) updates) => super.copyWith((message) => updates(message as CreateTextBlockParams)) as CreateTextBlockParams; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static CreateTextBlockParams create() => CreateTextBlockParams._(); + CreateTextBlockParams createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateTextBlockParams getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CreateTextBlockParams? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $0.RepeatedRevision get revisions => $_getN(1); + @$pb.TagNumber(2) + set revisions($0.RepeatedRevision v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasRevisions() => $_has(1); + @$pb.TagNumber(2) + void clearRevisions() => clearField(2); + @$pb.TagNumber(2) + $0.RepeatedRevision ensureRevisions() => $_ensure(1); +} + +class TextBlockInfo extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TextBlockInfo', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'text') + ..aInt64(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'revId') + ..aInt64(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'baseRevId') + ..hasRequiredFields = false + ; + + TextBlockInfo._() : super(); + factory TextBlockInfo({ + $core.String? blockId, + $core.String? text, + $fixnum.Int64? revId, + $fixnum.Int64? baseRevId, + }) { + final _result = create(); + if (blockId != null) { + _result.blockId = blockId; + } + if (text != null) { + _result.text = text; + } + if (revId != null) { + _result.revId = revId; + } + if (baseRevId != null) { + _result.baseRevId = baseRevId; + } + return _result; + } + factory TextBlockInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory TextBlockInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + TextBlockInfo clone() => TextBlockInfo()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + TextBlockInfo copyWith(void Function(TextBlockInfo) updates) => super.copyWith((message) => updates(message as TextBlockInfo)) as TextBlockInfo; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static TextBlockInfo create() => TextBlockInfo._(); + TextBlockInfo createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static TextBlockInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TextBlockInfo? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get blockId => $_getSZ(0); + @$pb.TagNumber(1) + set blockId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasBlockId() => $_has(0); + @$pb.TagNumber(1) + void clearBlockId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get text => $_getSZ(1); + @$pb.TagNumber(2) + set text($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasText() => $_has(1); + @$pb.TagNumber(2) + void clearText() => clearField(2); + + @$pb.TagNumber(3) + $fixnum.Int64 get revId => $_getI64(2); + @$pb.TagNumber(3) + set revId($fixnum.Int64 v) { $_setInt64(2, v); } + @$pb.TagNumber(3) + $core.bool hasRevId() => $_has(2); + @$pb.TagNumber(3) + void clearRevId() => clearField(3); + + @$pb.TagNumber(4) + $fixnum.Int64 get baseRevId => $_getI64(3); + @$pb.TagNumber(4) + set baseRevId($fixnum.Int64 v) { $_setInt64(3, v); } + @$pb.TagNumber(4) + $core.bool hasBaseRevId() => $_has(3); + @$pb.TagNumber(4) + void clearBaseRevId() => clearField(4); +} + +class ResetTextBlockParams extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ResetTextBlockParams', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') + ..aOM<$0.RepeatedRevision>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'revisions', subBuilder: $0.RepeatedRevision.create) + ..hasRequiredFields = false + ; + + ResetTextBlockParams._() : super(); + factory ResetTextBlockParams({ + $core.String? blockId, + $0.RepeatedRevision? revisions, + }) { + final _result = create(); + if (blockId != null) { + _result.blockId = blockId; + } + if (revisions != null) { + _result.revisions = revisions; + } + return _result; + } + factory ResetTextBlockParams.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ResetTextBlockParams.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ResetTextBlockParams clone() => ResetTextBlockParams()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ResetTextBlockParams copyWith(void Function(ResetTextBlockParams) updates) => super.copyWith((message) => updates(message as ResetTextBlockParams)) as ResetTextBlockParams; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static ResetTextBlockParams create() => ResetTextBlockParams._(); + ResetTextBlockParams createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ResetTextBlockParams getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ResetTextBlockParams? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get blockId => $_getSZ(0); + @$pb.TagNumber(1) + set blockId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasBlockId() => $_has(0); + @$pb.TagNumber(1) + void clearBlockId() => clearField(1); + + @$pb.TagNumber(2) + $0.RepeatedRevision get revisions => $_getN(1); + @$pb.TagNumber(2) + set revisions($0.RepeatedRevision v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasRevisions() => $_has(1); + @$pb.TagNumber(2) + void clearRevisions() => clearField(2); + @$pb.TagNumber(2) + $0.RepeatedRevision ensureRevisions() => $_ensure(1); +} + +class TextBlockDelta extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TextBlockDelta', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'deltaStr') + ..hasRequiredFields = false + ; + + TextBlockDelta._() : super(); + factory TextBlockDelta({ + $core.String? blockId, + $core.String? deltaStr, + }) { + final _result = create(); + if (blockId != null) { + _result.blockId = blockId; + } + if (deltaStr != null) { + _result.deltaStr = deltaStr; + } + return _result; + } + factory TextBlockDelta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory TextBlockDelta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + TextBlockDelta clone() => TextBlockDelta()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + TextBlockDelta copyWith(void Function(TextBlockDelta) updates) => super.copyWith((message) => updates(message as TextBlockDelta)) as TextBlockDelta; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static TextBlockDelta create() => TextBlockDelta._(); + TextBlockDelta createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static TextBlockDelta getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TextBlockDelta? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get blockId => $_getSZ(0); + @$pb.TagNumber(1) + set blockId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasBlockId() => $_has(0); + @$pb.TagNumber(1) + void clearBlockId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get deltaStr => $_getSZ(1); + @$pb.TagNumber(2) + set deltaStr($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasDeltaStr() => $_has(1); + @$pb.TagNumber(2) + void clearDeltaStr() => clearField(2); +} + +class NewDocUser extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NewDocUser', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'userId') + ..aInt64(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'revId') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'docId') + ..hasRequiredFields = false + ; + + NewDocUser._() : super(); + factory NewDocUser({ + $core.String? userId, + $fixnum.Int64? revId, + $core.String? docId, + }) { + final _result = create(); + if (userId != null) { + _result.userId = userId; + } + if (revId != null) { + _result.revId = revId; + } + if (docId != null) { + _result.docId = docId; + } + return _result; + } + factory NewDocUser.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory NewDocUser.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + NewDocUser clone() => NewDocUser()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + NewDocUser copyWith(void Function(NewDocUser) updates) => super.copyWith((message) => updates(message as NewDocUser)) as NewDocUser; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static NewDocUser create() => NewDocUser._(); + NewDocUser createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static NewDocUser getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static NewDocUser? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get userId => $_getSZ(0); + @$pb.TagNumber(1) + set userId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasUserId() => $_has(0); + @$pb.TagNumber(1) + void clearUserId() => clearField(1); + + @$pb.TagNumber(2) + $fixnum.Int64 get revId => $_getI64(1); + @$pb.TagNumber(2) + set revId($fixnum.Int64 v) { $_setInt64(1, v); } + @$pb.TagNumber(2) + $core.bool hasRevId() => $_has(1); + @$pb.TagNumber(2) + void clearRevId() => clearField(2); + + @$pb.TagNumber(3) + $core.String get docId => $_getSZ(2); + @$pb.TagNumber(3) + set docId($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasDocId() => $_has(2); + @$pb.TagNumber(3) + void clearDocId() => clearField(3); +} + +class TextBlockId extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TextBlockId', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value') + ..hasRequiredFields = false + ; + + TextBlockId._() : super(); + factory TextBlockId({ + $core.String? value, + }) { + final _result = create(); + if (value != null) { + _result.value = value; + } + return _result; + } + factory TextBlockId.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory TextBlockId.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + TextBlockId clone() => TextBlockId()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + TextBlockId copyWith(void Function(TextBlockId) updates) => super.copyWith((message) => updates(message as TextBlockId)) as TextBlockId; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static TextBlockId create() => TextBlockId._(); + TextBlockId createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static TextBlockId getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TextBlockId? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get value => $_getSZ(0); + @$pb.TagNumber(1) + set value($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasValue() => $_has(0); + @$pb.TagNumber(1) + void clearValue() => clearField(1); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pbenum.dart new file mode 100644 index 0000000000..20728d1388 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pbenum.dart @@ -0,0 +1,7 @@ +/// +// Generated code. Do not modify. +// source: text_block_info.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pbjson.dart new file mode 100644 index 0000000000..794b4ca433 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pbjson.dart @@ -0,0 +1,78 @@ +/// +// Generated code. Do not modify. +// source: text_block_info.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use createTextBlockParamsDescriptor instead') +const CreateTextBlockParams$json = const { + '1': 'CreateTextBlockParams', + '2': const [ + const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, + const {'1': 'revisions', '3': 2, '4': 1, '5': 11, '6': '.RepeatedRevision', '10': 'revisions'}, + ], +}; + +/// Descriptor for `CreateTextBlockParams`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List createTextBlockParamsDescriptor = $convert.base64Decode('ChVDcmVhdGVUZXh0QmxvY2tQYXJhbXMSDgoCaWQYASABKAlSAmlkEi8KCXJldmlzaW9ucxgCIAEoCzIRLlJlcGVhdGVkUmV2aXNpb25SCXJldmlzaW9ucw=='); +@$core.Deprecated('Use textBlockInfoDescriptor instead') +const TextBlockInfo$json = const { + '1': 'TextBlockInfo', + '2': const [ + const {'1': 'block_id', '3': 1, '4': 1, '5': 9, '10': 'blockId'}, + const {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'}, + const {'1': 'rev_id', '3': 3, '4': 1, '5': 3, '10': 'revId'}, + const {'1': 'base_rev_id', '3': 4, '4': 1, '5': 3, '10': 'baseRevId'}, + ], +}; + +/// Descriptor for `TextBlockInfo`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List textBlockInfoDescriptor = $convert.base64Decode('Cg1UZXh0QmxvY2tJbmZvEhkKCGJsb2NrX2lkGAEgASgJUgdibG9ja0lkEhIKBHRleHQYAiABKAlSBHRleHQSFQoGcmV2X2lkGAMgASgDUgVyZXZJZBIeCgtiYXNlX3Jldl9pZBgEIAEoA1IJYmFzZVJldklk'); +@$core.Deprecated('Use resetTextBlockParamsDescriptor instead') +const ResetTextBlockParams$json = const { + '1': 'ResetTextBlockParams', + '2': const [ + const {'1': 'block_id', '3': 1, '4': 1, '5': 9, '10': 'blockId'}, + const {'1': 'revisions', '3': 2, '4': 1, '5': 11, '6': '.RepeatedRevision', '10': 'revisions'}, + ], +}; + +/// Descriptor for `ResetTextBlockParams`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List resetTextBlockParamsDescriptor = $convert.base64Decode('ChRSZXNldFRleHRCbG9ja1BhcmFtcxIZCghibG9ja19pZBgBIAEoCVIHYmxvY2tJZBIvCglyZXZpc2lvbnMYAiABKAsyES5SZXBlYXRlZFJldmlzaW9uUglyZXZpc2lvbnM='); +@$core.Deprecated('Use textBlockDeltaDescriptor instead') +const TextBlockDelta$json = const { + '1': 'TextBlockDelta', + '2': const [ + const {'1': 'block_id', '3': 1, '4': 1, '5': 9, '10': 'blockId'}, + const {'1': 'delta_str', '3': 2, '4': 1, '5': 9, '10': 'deltaStr'}, + ], +}; + +/// Descriptor for `TextBlockDelta`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List textBlockDeltaDescriptor = $convert.base64Decode('Cg5UZXh0QmxvY2tEZWx0YRIZCghibG9ja19pZBgBIAEoCVIHYmxvY2tJZBIbCglkZWx0YV9zdHIYAiABKAlSCGRlbHRhU3Ry'); +@$core.Deprecated('Use newDocUserDescriptor instead') +const NewDocUser$json = const { + '1': 'NewDocUser', + '2': const [ + const {'1': 'user_id', '3': 1, '4': 1, '5': 9, '10': 'userId'}, + const {'1': 'rev_id', '3': 2, '4': 1, '5': 3, '10': 'revId'}, + const {'1': 'doc_id', '3': 3, '4': 1, '5': 9, '10': 'docId'}, + ], +}; + +/// Descriptor for `NewDocUser`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List newDocUserDescriptor = $convert.base64Decode('CgpOZXdEb2NVc2VyEhcKB3VzZXJfaWQYASABKAlSBnVzZXJJZBIVCgZyZXZfaWQYAiABKANSBXJldklkEhUKBmRvY19pZBgDIAEoCVIFZG9jSWQ='); +@$core.Deprecated('Use textBlockIdDescriptor instead') +const TextBlockId$json = const { + '1': 'TextBlockId', + '2': const [ + const {'1': 'value', '3': 1, '4': 1, '5': 9, '10': 'value'}, + ], +}; + +/// Descriptor for `TextBlockId`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List textBlockIdDescriptor = $convert.base64Decode('CgtUZXh0QmxvY2tJZBIUCgV2YWx1ZRgBIAEoCVIFdmFsdWU='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pbserver.dart new file mode 100644 index 0000000000..5c81f4cb56 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-collaboration/text_block_info.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: text_block_info.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'text_block_info.pb.dart'; + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbenum.dart index dcf1e69936..02e3e595c5 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbenum.dart @@ -40,6 +40,11 @@ class ErrorCode extends $pb.ProtobufEnum { static const ErrorCode UserNameIsEmpty = ErrorCode._(310, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserNameIsEmpty'); static const ErrorCode UserIdInvalid = ErrorCode._(311, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserIdInvalid'); static const ErrorCode UserNotExist = ErrorCode._(312, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserNotExist'); + static const ErrorCode TextTooLong = ErrorCode._(400, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TextTooLong'); + static const ErrorCode BlockIdIsEmpty = ErrorCode._(401, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'BlockIdIsEmpty'); + static const ErrorCode RowIdIsEmpty = ErrorCode._(402, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RowIdIsEmpty'); + static const ErrorCode GridIdIsEmpty = ErrorCode._(403, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GridIdIsEmpty'); + static const ErrorCode InvalidData = ErrorCode._(404, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'InvalidData'); static const $core.List values = [ Internal, @@ -72,6 +77,11 @@ class ErrorCode extends $pb.ProtobufEnum { UserNameIsEmpty, UserIdInvalid, UserNotExist, + TextTooLong, + BlockIdIsEmpty, + RowIdIsEmpty, + GridIdIsEmpty, + InvalidData, ]; static final $core.Map<$core.int, ErrorCode> _byValue = $pb.ProtobufEnum.initByValue(values); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbjson.dart index c8d7191d54..7a3269aa7f 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbjson.dart @@ -42,8 +42,13 @@ const ErrorCode$json = const { const {'1': 'UserNameIsEmpty', '2': 310}, const {'1': 'UserIdInvalid', '2': 311}, const {'1': 'UserNotExist', '2': 312}, + const {'1': 'TextTooLong', '2': 400}, + const {'1': 'BlockIdIsEmpty', '2': 401}, + const {'1': 'RowIdIsEmpty', '2': 402}, + const {'1': 'GridIdIsEmpty', '2': 403}, + const {'1': 'InvalidData', '2': 404}, ], }; /// Descriptor for `ErrorCode`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode('CglFcnJvckNvZGUSDAoISW50ZXJuYWwQABIUChBVc2VyVW5hdXRob3JpemVkEAISEgoOUmVjb3JkTm90Rm91bmQQAxIYChRXb3Jrc3BhY2VOYW1lSW52YWxpZBBkEhYKEldvcmtzcGFjZUlkSW52YWxpZBBlEhgKFEFwcENvbG9yU3R5bGVJbnZhbGlkEGYSGAoUV29ya3NwYWNlRGVzY1Rvb0xvbmcQZxIYChRXb3Jrc3BhY2VOYW1lVG9vTG9uZxBoEhAKDEFwcElkSW52YWxpZBBuEhIKDkFwcE5hbWVJbnZhbGlkEG8SEwoPVmlld05hbWVJbnZhbGlkEHgSGAoUVmlld1RodW1ibmFpbEludmFsaWQQeRIRCg1WaWV3SWRJbnZhbGlkEHoSEwoPVmlld0Rlc2NUb29Mb25nEHsSEwoPVmlld0RhdGFJbnZhbGlkEHwSEwoPVmlld05hbWVUb29Mb25nEH0SEQoMQ29ubmVjdEVycm9yEMgBEhEKDEVtYWlsSXNFbXB0eRCsAhIXChJFbWFpbEZvcm1hdEludmFsaWQQrQISFwoSRW1haWxBbHJlYWR5RXhpc3RzEK4CEhQKD1Bhc3N3b3JkSXNFbXB0eRCvAhIUCg9QYXNzd29yZFRvb0xvbmcQsAISJQogUGFzc3dvcmRDb250YWluc0ZvcmJpZENoYXJhY3RlcnMQsQISGgoVUGFzc3dvcmRGb3JtYXRJbnZhbGlkELICEhUKEFBhc3N3b3JkTm90TWF0Y2gQswISFAoPVXNlck5hbWVUb29Mb25nELQCEicKIlVzZXJOYW1lQ29udGFpbkZvcmJpZGRlbkNoYXJhY3RlcnMQtQISFAoPVXNlck5hbWVJc0VtcHR5ELYCEhIKDVVzZXJJZEludmFsaWQQtwISEQoMVXNlck5vdEV4aXN0ELgC'); +final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode('CglFcnJvckNvZGUSDAoISW50ZXJuYWwQABIUChBVc2VyVW5hdXRob3JpemVkEAISEgoOUmVjb3JkTm90Rm91bmQQAxIYChRXb3Jrc3BhY2VOYW1lSW52YWxpZBBkEhYKEldvcmtzcGFjZUlkSW52YWxpZBBlEhgKFEFwcENvbG9yU3R5bGVJbnZhbGlkEGYSGAoUV29ya3NwYWNlRGVzY1Rvb0xvbmcQZxIYChRXb3Jrc3BhY2VOYW1lVG9vTG9uZxBoEhAKDEFwcElkSW52YWxpZBBuEhIKDkFwcE5hbWVJbnZhbGlkEG8SEwoPVmlld05hbWVJbnZhbGlkEHgSGAoUVmlld1RodW1ibmFpbEludmFsaWQQeRIRCg1WaWV3SWRJbnZhbGlkEHoSEwoPVmlld0Rlc2NUb29Mb25nEHsSEwoPVmlld0RhdGFJbnZhbGlkEHwSEwoPVmlld05hbWVUb29Mb25nEH0SEQoMQ29ubmVjdEVycm9yEMgBEhEKDEVtYWlsSXNFbXB0eRCsAhIXChJFbWFpbEZvcm1hdEludmFsaWQQrQISFwoSRW1haWxBbHJlYWR5RXhpc3RzEK4CEhQKD1Bhc3N3b3JkSXNFbXB0eRCvAhIUCg9QYXNzd29yZFRvb0xvbmcQsAISJQogUGFzc3dvcmRDb250YWluc0ZvcmJpZENoYXJhY3RlcnMQsQISGgoVUGFzc3dvcmRGb3JtYXRJbnZhbGlkELICEhUKEFBhc3N3b3JkTm90TWF0Y2gQswISFAoPVXNlck5hbWVUb29Mb25nELQCEicKIlVzZXJOYW1lQ29udGFpbkZvcmJpZGRlbkNoYXJhY3RlcnMQtQISFAoPVXNlck5hbWVJc0VtcHR5ELYCEhIKDVVzZXJJZEludmFsaWQQtwISEQoMVXNlck5vdEV4aXN0ELgCEhAKC1RleHRUb29Mb25nEJADEhMKDkJsb2NrSWRJc0VtcHR5EJEDEhEKDFJvd0lkSXNFbXB0eRCSAxISCg1HcmlkSWRJc0VtcHR5EJMDEhAKC0ludmFsaWREYXRhEJQD'); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pb.dart index bc0b49b833..98882f444d 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pb.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pb.dart @@ -20,7 +20,7 @@ class View extends $pb.GeneratedMessage { ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'belongToId') ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc') - ..e(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dataType', $pb.PbFieldType.OE, defaultOrMaker: ViewDataType.Block, valueOf: ViewDataType.valueOf, enumValues: ViewDataType.values) + ..e(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dataType', $pb.PbFieldType.OE, defaultOrMaker: ViewDataType.TextBlock, valueOf: ViewDataType.valueOf, enumValues: ViewDataType.values) ..aInt64(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'version') ..aOM(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'belongings', subBuilder: RepeatedView.create) ..aInt64(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'modifiedTime') @@ -274,9 +274,9 @@ class CreateViewPayload extends $pb.GeneratedMessage { ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc') ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'thumbnail') - ..e(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dataType', $pb.PbFieldType.OE, defaultOrMaker: ViewDataType.Block, valueOf: ViewDataType.valueOf, enumValues: ViewDataType.values) - ..aOS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'extData') - ..a<$core.int>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'pluginType', $pb.PbFieldType.O3) + ..e(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dataType', $pb.PbFieldType.OE, defaultOrMaker: ViewDataType.TextBlock, valueOf: ViewDataType.valueOf, enumValues: ViewDataType.values) + ..a<$core.int>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'pluginType', $pb.PbFieldType.O3) + ..a<$core.List<$core.int>>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data', $pb.PbFieldType.OY) ..hasRequiredFields = false ; @@ -287,8 +287,8 @@ class CreateViewPayload extends $pb.GeneratedMessage { $core.String? desc, $core.String? thumbnail, ViewDataType? dataType, - $core.String? extData, $core.int? pluginType, + $core.List<$core.int>? data, }) { final _result = create(); if (belongToId != null) { @@ -306,12 +306,12 @@ class CreateViewPayload extends $pb.GeneratedMessage { if (dataType != null) { _result.dataType = dataType; } - if (extData != null) { - _result.extData = extData; - } if (pluginType != null) { _result.pluginType = pluginType; } + if (data != null) { + _result.data = data; + } return _result; } factory CreateViewPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); @@ -384,22 +384,22 @@ class CreateViewPayload extends $pb.GeneratedMessage { void clearDataType() => clearField(5); @$pb.TagNumber(6) - $core.String get extData => $_getSZ(5); + $core.int get pluginType => $_getIZ(5); @$pb.TagNumber(6) - set extData($core.String v) { $_setString(5, v); } + set pluginType($core.int v) { $_setSignedInt32(5, v); } @$pb.TagNumber(6) - $core.bool hasExtData() => $_has(5); + $core.bool hasPluginType() => $_has(5); @$pb.TagNumber(6) - void clearExtData() => clearField(6); + void clearPluginType() => clearField(6); @$pb.TagNumber(7) - $core.int get pluginType => $_getIZ(6); + $core.List<$core.int> get data => $_getN(6); @$pb.TagNumber(7) - set pluginType($core.int v) { $_setSignedInt32(6, v); } + set data($core.List<$core.int> v) { $_setBytes(6, v); } @$pb.TagNumber(7) - $core.bool hasPluginType() => $_has(6); + $core.bool hasData() => $_has(6); @$pb.TagNumber(7) - void clearPluginType() => clearField(7); + void clearData() => clearField(7); } class CreateViewParams extends $pb.GeneratedMessage { @@ -408,11 +408,10 @@ class CreateViewParams extends $pb.GeneratedMessage { ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc') ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'thumbnail') - ..e(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dataType', $pb.PbFieldType.OE, defaultOrMaker: ViewDataType.Block, valueOf: ViewDataType.valueOf, enumValues: ViewDataType.values) - ..aOS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'extData') - ..aOS(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'viewId') - ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data') - ..a<$core.int>(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'pluginType', $pb.PbFieldType.O3) + ..e(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dataType', $pb.PbFieldType.OE, defaultOrMaker: ViewDataType.TextBlock, valueOf: ViewDataType.valueOf, enumValues: ViewDataType.values) + ..aOS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'viewId') + ..a<$core.List<$core.int>>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data', $pb.PbFieldType.OY) + ..a<$core.int>(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'pluginType', $pb.PbFieldType.O3) ..hasRequiredFields = false ; @@ -423,9 +422,8 @@ class CreateViewParams extends $pb.GeneratedMessage { $core.String? desc, $core.String? thumbnail, ViewDataType? dataType, - $core.String? extData, $core.String? viewId, - $core.String? data, + $core.List<$core.int>? data, $core.int? pluginType, }) { final _result = create(); @@ -444,9 +442,6 @@ class CreateViewParams extends $pb.GeneratedMessage { if (dataType != null) { _result.dataType = dataType; } - if (extData != null) { - _result.extData = extData; - } if (viewId != null) { _result.viewId = viewId; } @@ -525,40 +520,31 @@ class CreateViewParams extends $pb.GeneratedMessage { void clearDataType() => clearField(5); @$pb.TagNumber(6) - $core.String get extData => $_getSZ(5); + $core.String get viewId => $_getSZ(5); @$pb.TagNumber(6) - set extData($core.String v) { $_setString(5, v); } + set viewId($core.String v) { $_setString(5, v); } @$pb.TagNumber(6) - $core.bool hasExtData() => $_has(5); + $core.bool hasViewId() => $_has(5); @$pb.TagNumber(6) - void clearExtData() => clearField(6); + void clearViewId() => clearField(6); @$pb.TagNumber(7) - $core.String get viewId => $_getSZ(6); + $core.List<$core.int> get data => $_getN(6); @$pb.TagNumber(7) - set viewId($core.String v) { $_setString(6, v); } + set data($core.List<$core.int> v) { $_setBytes(6, v); } @$pb.TagNumber(7) - $core.bool hasViewId() => $_has(6); + $core.bool hasData() => $_has(6); @$pb.TagNumber(7) - void clearViewId() => clearField(7); + void clearData() => clearField(7); @$pb.TagNumber(8) - $core.String get data => $_getSZ(7); + $core.int get pluginType => $_getIZ(7); @$pb.TagNumber(8) - set data($core.String v) { $_setString(7, v); } + set pluginType($core.int v) { $_setSignedInt32(7, v); } @$pb.TagNumber(8) - $core.bool hasData() => $_has(7); + $core.bool hasPluginType() => $_has(7); @$pb.TagNumber(8) - void clearData() => clearField(8); - - @$pb.TagNumber(9) - $core.int get pluginType => $_getIZ(8); - @$pb.TagNumber(9) - set pluginType($core.int v) { $_setSignedInt32(8, v); } - @$pb.TagNumber(9) - $core.bool hasPluginType() => $_has(8); - @$pb.TagNumber(9) - void clearPluginType() => clearField(9); + void clearPluginType() => clearField(8); } class ViewId extends $pb.GeneratedMessage { diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pbenum.dart index f644361742..aa7b0105b1 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pbenum.dart @@ -10,11 +10,11 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; class ViewDataType extends $pb.ProtobufEnum { - static const ViewDataType Block = ViewDataType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Block'); + static const ViewDataType TextBlock = ViewDataType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TextBlock'); static const ViewDataType Grid = ViewDataType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Grid'); static const $core.List values = [ - Block, + TextBlock, Grid, ]; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pbjson.dart index 87ebb89969..0f1949754f 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/view.pbjson.dart @@ -12,13 +12,13 @@ import 'dart:typed_data' as $typed_data; const ViewDataType$json = const { '1': 'ViewDataType', '2': const [ - const {'1': 'Block', '2': 0}, + const {'1': 'TextBlock', '2': 0}, const {'1': 'Grid', '2': 1}, ], }; /// Descriptor for `ViewDataType`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List viewDataTypeDescriptor = $convert.base64Decode('CgxWaWV3RGF0YVR5cGUSCQoFQmxvY2sQABIICgRHcmlkEAE='); +final $typed_data.Uint8List viewDataTypeDescriptor = $convert.base64Decode('CgxWaWV3RGF0YVR5cGUSDQoJVGV4dEJsb2NrEAASCAoER3JpZBAB'); @$core.Deprecated('Use viewDescriptor instead') const View$json = const { '1': 'View', @@ -59,8 +59,8 @@ const CreateViewPayload$json = const { const {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'}, const {'1': 'thumbnail', '3': 4, '4': 1, '5': 9, '9': 0, '10': 'thumbnail'}, const {'1': 'data_type', '3': 5, '4': 1, '5': 14, '6': '.ViewDataType', '10': 'dataType'}, - const {'1': 'ext_data', '3': 6, '4': 1, '5': 9, '10': 'extData'}, - const {'1': 'plugin_type', '3': 7, '4': 1, '5': 5, '10': 'pluginType'}, + const {'1': 'plugin_type', '3': 6, '4': 1, '5': 5, '10': 'pluginType'}, + const {'1': 'data', '3': 7, '4': 1, '5': 12, '10': 'data'}, ], '8': const [ const {'1': 'one_of_thumbnail'}, @@ -68,7 +68,7 @@ const CreateViewPayload$json = const { }; /// Descriptor for `CreateViewPayload`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List createViewPayloadDescriptor = $convert.base64Decode('ChFDcmVhdGVWaWV3UGF5bG9hZBIgCgxiZWxvbmdfdG9faWQYASABKAlSCmJlbG9uZ1RvSWQSEgoEbmFtZRgCIAEoCVIEbmFtZRISCgRkZXNjGAMgASgJUgRkZXNjEh4KCXRodW1ibmFpbBgEIAEoCUgAUgl0aHVtYm5haWwSKgoJZGF0YV90eXBlGAUgASgOMg0uVmlld0RhdGFUeXBlUghkYXRhVHlwZRIZCghleHRfZGF0YRgGIAEoCVIHZXh0RGF0YRIfCgtwbHVnaW5fdHlwZRgHIAEoBVIKcGx1Z2luVHlwZUISChBvbmVfb2ZfdGh1bWJuYWls'); +final $typed_data.Uint8List createViewPayloadDescriptor = $convert.base64Decode('ChFDcmVhdGVWaWV3UGF5bG9hZBIgCgxiZWxvbmdfdG9faWQYASABKAlSCmJlbG9uZ1RvSWQSEgoEbmFtZRgCIAEoCVIEbmFtZRISCgRkZXNjGAMgASgJUgRkZXNjEh4KCXRodW1ibmFpbBgEIAEoCUgAUgl0aHVtYm5haWwSKgoJZGF0YV90eXBlGAUgASgOMg0uVmlld0RhdGFUeXBlUghkYXRhVHlwZRIfCgtwbHVnaW5fdHlwZRgGIAEoBVIKcGx1Z2luVHlwZRISCgRkYXRhGAcgASgMUgRkYXRhQhIKEG9uZV9vZl90aHVtYm5haWw='); @$core.Deprecated('Use createViewParamsDescriptor instead') const CreateViewParams$json = const { '1': 'CreateViewParams', @@ -78,15 +78,14 @@ const CreateViewParams$json = const { const {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'}, const {'1': 'thumbnail', '3': 4, '4': 1, '5': 9, '10': 'thumbnail'}, const {'1': 'data_type', '3': 5, '4': 1, '5': 14, '6': '.ViewDataType', '10': 'dataType'}, - const {'1': 'ext_data', '3': 6, '4': 1, '5': 9, '10': 'extData'}, - const {'1': 'view_id', '3': 7, '4': 1, '5': 9, '10': 'viewId'}, - const {'1': 'data', '3': 8, '4': 1, '5': 9, '10': 'data'}, - const {'1': 'plugin_type', '3': 9, '4': 1, '5': 5, '10': 'pluginType'}, + const {'1': 'view_id', '3': 6, '4': 1, '5': 9, '10': 'viewId'}, + const {'1': 'data', '3': 7, '4': 1, '5': 12, '10': 'data'}, + const {'1': 'plugin_type', '3': 8, '4': 1, '5': 5, '10': 'pluginType'}, ], }; /// Descriptor for `CreateViewParams`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List createViewParamsDescriptor = $convert.base64Decode('ChBDcmVhdGVWaWV3UGFyYW1zEiAKDGJlbG9uZ190b19pZBgBIAEoCVIKYmVsb25nVG9JZBISCgRuYW1lGAIgASgJUgRuYW1lEhIKBGRlc2MYAyABKAlSBGRlc2MSHAoJdGh1bWJuYWlsGAQgASgJUgl0aHVtYm5haWwSKgoJZGF0YV90eXBlGAUgASgOMg0uVmlld0RhdGFUeXBlUghkYXRhVHlwZRIZCghleHRfZGF0YRgGIAEoCVIHZXh0RGF0YRIXCgd2aWV3X2lkGAcgASgJUgZ2aWV3SWQSEgoEZGF0YRgIIAEoCVIEZGF0YRIfCgtwbHVnaW5fdHlwZRgJIAEoBVIKcGx1Z2luVHlwZQ=='); +final $typed_data.Uint8List createViewParamsDescriptor = $convert.base64Decode('ChBDcmVhdGVWaWV3UGFyYW1zEiAKDGJlbG9uZ190b19pZBgBIAEoCVIKYmVsb25nVG9JZBISCgRuYW1lGAIgASgJUgRuYW1lEhIKBGRlc2MYAyABKAlSBGRlc2MSHAoJdGh1bWJuYWlsGAQgASgJUgl0aHVtYm5haWwSKgoJZGF0YV90eXBlGAUgASgOMg0uVmlld0RhdGFUeXBlUghkYXRhVHlwZRIXCgd2aWV3X2lkGAYgASgJUgZ2aWV3SWQSEgoEZGF0YRgHIAEoDFIEZGF0YRIfCgtwbHVnaW5fdHlwZRgIIAEoBVIKcGx1Z2luVHlwZQ=='); @$core.Deprecated('Use viewIdDescriptor instead') const ViewId$json = const { '1': 'ViewId', diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pb.dart index 102be7fb09..bc713bbdb8 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pb.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pb.dart @@ -9,33 +9,31 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -import 'grid.pbenum.dart'; - -export 'grid.pbenum.dart'; +import 'meta.pbenum.dart' as $0; class Grid extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Grid', createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') - ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldOrders', subBuilder: RepeatedFieldOrder.create) - ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowOrders', subBuilder: RepeatedRowOrder.create) + ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldOrders', $pb.PbFieldType.PM, subBuilder: FieldOrder.create) + ..pc(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockOrders', $pb.PbFieldType.PM, subBuilder: GridBlockOrder.create) ..hasRequiredFields = false ; Grid._() : super(); factory Grid({ $core.String? id, - RepeatedFieldOrder? fieldOrders, - RepeatedRowOrder? rowOrders, + $core.Iterable? fieldOrders, + $core.Iterable? blockOrders, }) { final _result = create(); if (id != null) { _result.id = id; } if (fieldOrders != null) { - _result.fieldOrders = fieldOrders; + _result.fieldOrders.addAll(fieldOrders); } - if (rowOrders != null) { - _result.rowOrders = rowOrders; + if (blockOrders != null) { + _result.blockOrders.addAll(blockOrders); } return _result; } @@ -70,128 +68,10 @@ class Grid extends $pb.GeneratedMessage { void clearId() => clearField(1); @$pb.TagNumber(2) - RepeatedFieldOrder get fieldOrders => $_getN(1); - @$pb.TagNumber(2) - set fieldOrders(RepeatedFieldOrder v) { setField(2, v); } - @$pb.TagNumber(2) - $core.bool hasFieldOrders() => $_has(1); - @$pb.TagNumber(2) - void clearFieldOrders() => clearField(2); - @$pb.TagNumber(2) - RepeatedFieldOrder ensureFieldOrders() => $_ensure(1); + $core.List get fieldOrders => $_getList(1); @$pb.TagNumber(3) - RepeatedRowOrder get rowOrders => $_getN(2); - @$pb.TagNumber(3) - set rowOrders(RepeatedRowOrder v) { setField(3, v); } - @$pb.TagNumber(3) - $core.bool hasRowOrders() => $_has(2); - @$pb.TagNumber(3) - void clearRowOrders() => clearField(3); - @$pb.TagNumber(3) - RepeatedRowOrder ensureRowOrders() => $_ensure(2); -} - -class FieldOrder extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FieldOrder', createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId') - ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility') - ..hasRequiredFields = false - ; - - FieldOrder._() : super(); - factory FieldOrder({ - $core.String? fieldId, - $core.bool? visibility, - }) { - final _result = create(); - if (fieldId != null) { - _result.fieldId = fieldId; - } - if (visibility != null) { - _result.visibility = visibility; - } - return _result; - } - factory FieldOrder.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory FieldOrder.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - FieldOrder clone() => FieldOrder()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - FieldOrder copyWith(void Function(FieldOrder) updates) => super.copyWith((message) => updates(message as FieldOrder)) as FieldOrder; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static FieldOrder create() => FieldOrder._(); - FieldOrder createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static FieldOrder getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static FieldOrder? _defaultInstance; - - @$pb.TagNumber(1) - $core.String get fieldId => $_getSZ(0); - @$pb.TagNumber(1) - set fieldId($core.String v) { $_setString(0, v); } - @$pb.TagNumber(1) - $core.bool hasFieldId() => $_has(0); - @$pb.TagNumber(1) - void clearFieldId() => clearField(1); - - @$pb.TagNumber(2) - $core.bool get visibility => $_getBF(1); - @$pb.TagNumber(2) - set visibility($core.bool v) { $_setBool(1, v); } - @$pb.TagNumber(2) - $core.bool hasVisibility() => $_has(1); - @$pb.TagNumber(2) - void clearVisibility() => clearField(2); -} - -class RepeatedFieldOrder extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedFieldOrder', createEmptyInstance: create) - ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: FieldOrder.create) - ..hasRequiredFields = false - ; - - RepeatedFieldOrder._() : super(); - factory RepeatedFieldOrder({ - $core.Iterable? items, - }) { - final _result = create(); - if (items != null) { - _result.items.addAll(items); - } - return _result; - } - factory RepeatedFieldOrder.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory RepeatedFieldOrder.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - RepeatedFieldOrder clone() => RepeatedFieldOrder()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - RepeatedFieldOrder copyWith(void Function(RepeatedFieldOrder) updates) => super.copyWith((message) => updates(message as RepeatedFieldOrder)) as RepeatedFieldOrder; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static RepeatedFieldOrder create() => RepeatedFieldOrder._(); - RepeatedFieldOrder createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static RepeatedFieldOrder getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static RepeatedFieldOrder? _defaultInstance; - - @$pb.TagNumber(1) - $core.List get items => $_getList(0); + $core.List get blockOrders => $_getList(2); } class Field extends $pb.GeneratedMessage { @@ -199,10 +79,10 @@ class Field extends $pb.GeneratedMessage { ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc') - ..e(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: FieldType.RichText, valueOf: FieldType.valueOf, enumValues: FieldType.values) + ..e<$0.FieldType>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: $0.FieldType.RichText, valueOf: $0.FieldType.valueOf, enumValues: $0.FieldType.values) ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'frozen') - ..a<$core.int>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.O3) - ..aOM(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeOptions', subBuilder: AnyData.create) + ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility') + ..a<$core.int>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.O3) ..hasRequiredFields = false ; @@ -211,10 +91,10 @@ class Field extends $pb.GeneratedMessage { $core.String? id, $core.String? name, $core.String? desc, - FieldType? fieldType, + $0.FieldType? fieldType, $core.bool? frozen, + $core.bool? visibility, $core.int? width, - AnyData? typeOptions, }) { final _result = create(); if (id != null) { @@ -232,12 +112,12 @@ class Field extends $pb.GeneratedMessage { if (frozen != null) { _result.frozen = frozen; } + if (visibility != null) { + _result.visibility = visibility; + } if (width != null) { _result.width = width; } - if (typeOptions != null) { - _result.typeOptions = typeOptions; - } return _result; } factory Field.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); @@ -289,9 +169,9 @@ class Field extends $pb.GeneratedMessage { void clearDesc() => clearField(3); @$pb.TagNumber(4) - FieldType get fieldType => $_getN(3); + $0.FieldType get fieldType => $_getN(3); @$pb.TagNumber(4) - set fieldType(FieldType v) { setField(4, v); } + set fieldType($0.FieldType v) { setField(4, v); } @$pb.TagNumber(4) $core.bool hasFieldType() => $_has(3); @$pb.TagNumber(4) @@ -307,24 +187,69 @@ class Field extends $pb.GeneratedMessage { void clearFrozen() => clearField(5); @$pb.TagNumber(6) - $core.int get width => $_getIZ(5); + $core.bool get visibility => $_getBF(5); @$pb.TagNumber(6) - set width($core.int v) { $_setSignedInt32(5, v); } + set visibility($core.bool v) { $_setBool(5, v); } @$pb.TagNumber(6) - $core.bool hasWidth() => $_has(5); + $core.bool hasVisibility() => $_has(5); @$pb.TagNumber(6) - void clearWidth() => clearField(6); + void clearVisibility() => clearField(6); @$pb.TagNumber(7) - AnyData get typeOptions => $_getN(6); + $core.int get width => $_getIZ(6); @$pb.TagNumber(7) - set typeOptions(AnyData v) { setField(7, v); } + set width($core.int v) { $_setSignedInt32(6, v); } @$pb.TagNumber(7) - $core.bool hasTypeOptions() => $_has(6); + $core.bool hasWidth() => $_has(6); @$pb.TagNumber(7) - void clearTypeOptions() => clearField(7); - @$pb.TagNumber(7) - AnyData ensureTypeOptions() => $_ensure(6); + void clearWidth() => clearField(7); +} + +class FieldOrder extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FieldOrder', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId') + ..hasRequiredFields = false + ; + + FieldOrder._() : super(); + factory FieldOrder({ + $core.String? fieldId, + }) { + final _result = create(); + if (fieldId != null) { + _result.fieldId = fieldId; + } + return _result; + } + factory FieldOrder.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory FieldOrder.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + FieldOrder clone() => FieldOrder()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + FieldOrder copyWith(void Function(FieldOrder) updates) => super.copyWith((message) => updates(message as FieldOrder)) as FieldOrder; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static FieldOrder create() => FieldOrder._(); + FieldOrder createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static FieldOrder getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static FieldOrder? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get fieldId => $_getSZ(0); + @$pb.TagNumber(1) + set fieldId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasFieldId() => $_has(0); + @$pb.TagNumber(1) + void clearFieldId() => clearField(1); } class RepeatedField extends $pb.GeneratedMessage { @@ -368,90 +293,70 @@ class RepeatedField extends $pb.GeneratedMessage { $core.List get items => $_getList(0); } -class AnyData extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AnyData', createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeId') - ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OY) +class RepeatedFieldOrder extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedFieldOrder', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: FieldOrder.create) ..hasRequiredFields = false ; - AnyData._() : super(); - factory AnyData({ - $core.String? typeId, - $core.List<$core.int>? value, + RepeatedFieldOrder._() : super(); + factory RepeatedFieldOrder({ + $core.Iterable? items, }) { final _result = create(); - if (typeId != null) { - _result.typeId = typeId; - } - if (value != null) { - _result.value = value; + if (items != null) { + _result.items.addAll(items); } return _result; } - factory AnyData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory AnyData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + factory RepeatedFieldOrder.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RepeatedFieldOrder.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Will be removed in next major version') - AnyData clone() => AnyData()..mergeFromMessage(this); + RepeatedFieldOrder clone() => RepeatedFieldOrder()..mergeFromMessage(this); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - AnyData copyWith(void Function(AnyData) updates) => super.copyWith((message) => updates(message as AnyData)) as AnyData; // ignore: deprecated_member_use + RepeatedFieldOrder copyWith(void Function(RepeatedFieldOrder) updates) => super.copyWith((message) => updates(message as RepeatedFieldOrder)) as RepeatedFieldOrder; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static AnyData create() => AnyData._(); - AnyData createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static RepeatedFieldOrder create() => RepeatedFieldOrder._(); + RepeatedFieldOrder createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static AnyData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static AnyData? _defaultInstance; + static RepeatedFieldOrder getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RepeatedFieldOrder? _defaultInstance; @$pb.TagNumber(1) - $core.String get typeId => $_getSZ(0); - @$pb.TagNumber(1) - set typeId($core.String v) { $_setString(0, v); } - @$pb.TagNumber(1) - $core.bool hasTypeId() => $_has(0); - @$pb.TagNumber(1) - void clearTypeId() => clearField(1); - - @$pb.TagNumber(2) - $core.List<$core.int> get value => $_getN(1); - @$pb.TagNumber(2) - set value($core.List<$core.int> v) { $_setBytes(1, v); } - @$pb.TagNumber(2) - $core.bool hasValue() => $_has(1); - @$pb.TagNumber(2) - void clearValue() => clearField(2); + $core.List get items => $_getList(0); } class RowOrder extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RowOrder', createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') - ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId') - ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility') + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') + ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', $pb.PbFieldType.O3) ..hasRequiredFields = false ; RowOrder._() : super(); factory RowOrder({ - $core.String? gridId, $core.String? rowId, - $core.bool? visibility, + $core.String? blockId, + $core.int? height, }) { final _result = create(); - if (gridId != null) { - _result.gridId = gridId; - } if (rowId != null) { _result.rowId = rowId; } - if (visibility != null) { - _result.visibility = visibility; + if (blockId != null) { + _result.blockId = blockId; + } + if (height != null) { + _result.height = height; } return _result; } @@ -477,120 +382,79 @@ class RowOrder extends $pb.GeneratedMessage { static RowOrder? _defaultInstance; @$pb.TagNumber(1) - $core.String get gridId => $_getSZ(0); + $core.String get rowId => $_getSZ(0); @$pb.TagNumber(1) - set gridId($core.String v) { $_setString(0, v); } + set rowId($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) - $core.bool hasGridId() => $_has(0); + $core.bool hasRowId() => $_has(0); @$pb.TagNumber(1) - void clearGridId() => clearField(1); + void clearRowId() => clearField(1); @$pb.TagNumber(2) - $core.String get rowId => $_getSZ(1); + $core.String get blockId => $_getSZ(1); @$pb.TagNumber(2) - set rowId($core.String v) { $_setString(1, v); } + set blockId($core.String v) { $_setString(1, v); } @$pb.TagNumber(2) - $core.bool hasRowId() => $_has(1); + $core.bool hasBlockId() => $_has(1); @$pb.TagNumber(2) - void clearRowId() => clearField(2); + void clearBlockId() => clearField(2); @$pb.TagNumber(3) - $core.bool get visibility => $_getBF(2); + $core.int get height => $_getIZ(2); @$pb.TagNumber(3) - set visibility($core.bool v) { $_setBool(2, v); } + set height($core.int v) { $_setSignedInt32(2, v); } @$pb.TagNumber(3) - $core.bool hasVisibility() => $_has(2); + $core.bool hasHeight() => $_has(2); @$pb.TagNumber(3) - void clearVisibility() => clearField(3); + void clearHeight() => clearField(3); } -class RepeatedRowOrder extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedRowOrder', createEmptyInstance: create) - ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: RowOrder.create) - ..hasRequiredFields = false - ; - - RepeatedRowOrder._() : super(); - factory RepeatedRowOrder({ - $core.Iterable? items, - }) { - final _result = create(); - if (items != null) { - _result.items.addAll(items); - } - return _result; - } - factory RepeatedRowOrder.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory RepeatedRowOrder.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - RepeatedRowOrder clone() => RepeatedRowOrder()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - RepeatedRowOrder copyWith(void Function(RepeatedRowOrder) updates) => super.copyWith((message) => updates(message as RepeatedRowOrder)) as RepeatedRowOrder; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static RepeatedRowOrder create() => RepeatedRowOrder._(); - RepeatedRowOrder createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static RepeatedRowOrder getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static RepeatedRowOrder? _defaultInstance; - - @$pb.TagNumber(1) - $core.List get items => $_getList(0); -} - -class RawRow extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RawRow', createEmptyInstance: create) +class Row extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Row', createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') - ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') - ..m<$core.String, RawCell>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cellByFieldId', entryClassName: 'RawRow.CellByFieldIdEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OM, valueCreator: RawCell.create) + ..m<$core.String, Cell>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cellByFieldId', entryClassName: 'Row.CellByFieldIdEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OM, valueCreator: Cell.create) + ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', $pb.PbFieldType.O3) ..hasRequiredFields = false ; - RawRow._() : super(); - factory RawRow({ + Row._() : super(); + factory Row({ $core.String? id, - $core.String? gridId, - $core.Map<$core.String, RawCell>? cellByFieldId, + $core.Map<$core.String, Cell>? cellByFieldId, + $core.int? height, }) { final _result = create(); if (id != null) { _result.id = id; } - if (gridId != null) { - _result.gridId = gridId; - } if (cellByFieldId != null) { _result.cellByFieldId.addAll(cellByFieldId); } + if (height != null) { + _result.height = height; + } return _result; } - factory RawRow.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory RawRow.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + factory Row.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory Row.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Will be removed in next major version') - RawRow clone() => RawRow()..mergeFromMessage(this); + Row clone() => Row()..mergeFromMessage(this); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - RawRow copyWith(void Function(RawRow) updates) => super.copyWith((message) => updates(message as RawRow)) as RawRow; // ignore: deprecated_member_use + Row copyWith(void Function(Row) updates) => super.copyWith((message) => updates(message as Row)) as Row; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static RawRow create() => RawRow._(); - RawRow createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static Row create() => Row._(); + Row createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static RawRow getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static RawRow? _defaultInstance; + static Row getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Row? _defaultInstance; @$pb.TagNumber(1) $core.String get id => $_getSZ(0); @@ -602,107 +466,16 @@ class RawRow extends $pb.GeneratedMessage { void clearId() => clearField(1); @$pb.TagNumber(2) - $core.String get gridId => $_getSZ(1); - @$pb.TagNumber(2) - set gridId($core.String v) { $_setString(1, v); } - @$pb.TagNumber(2) - $core.bool hasGridId() => $_has(1); - @$pb.TagNumber(2) - void clearGridId() => clearField(2); + $core.Map<$core.String, Cell> get cellByFieldId => $_getMap(1); @$pb.TagNumber(3) - $core.Map<$core.String, RawCell> get cellByFieldId => $_getMap(2); -} - -class RawCell extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RawCell', createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') - ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId') - ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId') - ..aOM(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data', subBuilder: AnyData.create) - ..hasRequiredFields = false - ; - - RawCell._() : super(); - factory RawCell({ - $core.String? id, - $core.String? rowId, - $core.String? fieldId, - AnyData? data, - }) { - final _result = create(); - if (id != null) { - _result.id = id; - } - if (rowId != null) { - _result.rowId = rowId; - } - if (fieldId != null) { - _result.fieldId = fieldId; - } - if (data != null) { - _result.data = data; - } - return _result; - } - factory RawCell.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory RawCell.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - RawCell clone() => RawCell()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - RawCell copyWith(void Function(RawCell) updates) => super.copyWith((message) => updates(message as RawCell)) as RawCell; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static RawCell create() => RawCell._(); - RawCell createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static RawCell getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static RawCell? _defaultInstance; - - @$pb.TagNumber(1) - $core.String get id => $_getSZ(0); - @$pb.TagNumber(1) - set id($core.String v) { $_setString(0, v); } - @$pb.TagNumber(1) - $core.bool hasId() => $_has(0); - @$pb.TagNumber(1) - void clearId() => clearField(1); - - @$pb.TagNumber(2) - $core.String get rowId => $_getSZ(1); - @$pb.TagNumber(2) - set rowId($core.String v) { $_setString(1, v); } - @$pb.TagNumber(2) - $core.bool hasRowId() => $_has(1); - @$pb.TagNumber(2) - void clearRowId() => clearField(2); - + $core.int get height => $_getIZ(2); @$pb.TagNumber(3) - $core.String get fieldId => $_getSZ(2); + set height($core.int v) { $_setSignedInt32(2, v); } @$pb.TagNumber(3) - set fieldId($core.String v) { $_setString(2, v); } + $core.bool hasHeight() => $_has(2); @$pb.TagNumber(3) - $core.bool hasFieldId() => $_has(2); - @$pb.TagNumber(3) - void clearFieldId() => clearField(3); - - @$pb.TagNumber(4) - AnyData get data => $_getN(3); - @$pb.TagNumber(4) - set data(AnyData v) { setField(4, v); } - @$pb.TagNumber(4) - $core.bool hasData() => $_has(3); - @$pb.TagNumber(4) - void clearData() => clearField(4); - @$pb.TagNumber(4) - AnyData ensureData() => $_ensure(3); + void clearHeight() => clearField(3); } class RepeatedRow extends $pb.GeneratedMessage { @@ -746,79 +519,162 @@ class RepeatedRow extends $pb.GeneratedMessage { $core.List get items => $_getList(0); } -class Row extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Row', createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') - ..m<$core.String, Cell>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cellByFieldId', entryClassName: 'Row.CellByFieldIdEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OM, valueCreator: Cell.create) +class RepeatedGridBlock extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedGridBlock', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: GridBlock.create) ..hasRequiredFields = false ; - Row._() : super(); - factory Row({ - $core.String? id, - $core.Map<$core.String, Cell>? cellByFieldId, + RepeatedGridBlock._() : super(); + factory RepeatedGridBlock({ + $core.Iterable? items, }) { final _result = create(); - if (id != null) { - _result.id = id; - } - if (cellByFieldId != null) { - _result.cellByFieldId.addAll(cellByFieldId); + if (items != null) { + _result.items.addAll(items); } return _result; } - factory Row.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory Row.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + factory RepeatedGridBlock.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RepeatedGridBlock.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Will be removed in next major version') - Row clone() => Row()..mergeFromMessage(this); + RepeatedGridBlock clone() => RepeatedGridBlock()..mergeFromMessage(this); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - Row copyWith(void Function(Row) updates) => super.copyWith((message) => updates(message as Row)) as Row; // ignore: deprecated_member_use + RepeatedGridBlock copyWith(void Function(RepeatedGridBlock) updates) => super.copyWith((message) => updates(message as RepeatedGridBlock)) as RepeatedGridBlock; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static Row create() => Row._(); - Row createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static RepeatedGridBlock create() => RepeatedGridBlock._(); + RepeatedGridBlock createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static Row getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static Row? _defaultInstance; + static RepeatedGridBlock getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RepeatedGridBlock? _defaultInstance; @$pb.TagNumber(1) - $core.String get id => $_getSZ(0); + $core.List get items => $_getList(0); +} + +class GridBlockOrder extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GridBlockOrder', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') + ..hasRequiredFields = false + ; + + GridBlockOrder._() : super(); + factory GridBlockOrder({ + $core.String? blockId, + }) { + final _result = create(); + if (blockId != null) { + _result.blockId = blockId; + } + return _result; + } + factory GridBlockOrder.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory GridBlockOrder.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + GridBlockOrder clone() => GridBlockOrder()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + GridBlockOrder copyWith(void Function(GridBlockOrder) updates) => super.copyWith((message) => updates(message as GridBlockOrder)) as GridBlockOrder; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static GridBlockOrder create() => GridBlockOrder._(); + GridBlockOrder createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static GridBlockOrder getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static GridBlockOrder? _defaultInstance; + @$pb.TagNumber(1) - set id($core.String v) { $_setString(0, v); } + $core.String get blockId => $_getSZ(0); @$pb.TagNumber(1) - $core.bool hasId() => $_has(0); + set blockId($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) - void clearId() => clearField(1); + $core.bool hasBlockId() => $_has(0); + @$pb.TagNumber(1) + void clearBlockId() => clearField(1); +} + +class GridBlock extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GridBlock', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') + ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowOrders', $pb.PbFieldType.PM, subBuilder: RowOrder.create) + ..hasRequiredFields = false + ; + + GridBlock._() : super(); + factory GridBlock({ + $core.String? blockId, + $core.Iterable? rowOrders, + }) { + final _result = create(); + if (blockId != null) { + _result.blockId = blockId; + } + if (rowOrders != null) { + _result.rowOrders.addAll(rowOrders); + } + return _result; + } + factory GridBlock.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory GridBlock.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + GridBlock clone() => GridBlock()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + GridBlock copyWith(void Function(GridBlock) updates) => super.copyWith((message) => updates(message as GridBlock)) as GridBlock; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static GridBlock create() => GridBlock._(); + GridBlock createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static GridBlock getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static GridBlock? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get blockId => $_getSZ(0); + @$pb.TagNumber(1) + set blockId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasBlockId() => $_has(0); + @$pb.TagNumber(1) + void clearBlockId() => clearField(1); @$pb.TagNumber(2) - $core.Map<$core.String, Cell> get cellByFieldId => $_getMap(1); + $core.List get rowOrders => $_getList(1); } class Cell extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Cell', createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') - ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId') - ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'content') + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'content') ..hasRequiredFields = false ; Cell._() : super(); factory Cell({ - $core.String? id, $core.String? fieldId, $core.String? content, }) { final _result = create(); - if (id != null) { - _result.id = id; - } if (fieldId != null) { _result.fieldId = fieldId; } @@ -849,120 +705,63 @@ class Cell extends $pb.GeneratedMessage { static Cell? _defaultInstance; @$pb.TagNumber(1) - $core.String get id => $_getSZ(0); + $core.String get fieldId => $_getSZ(0); @$pb.TagNumber(1) - set id($core.String v) { $_setString(0, v); } + set fieldId($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) - $core.bool hasId() => $_has(0); + $core.bool hasFieldId() => $_has(0); @$pb.TagNumber(1) - void clearId() => clearField(1); + void clearFieldId() => clearField(1); @$pb.TagNumber(2) - $core.String get fieldId => $_getSZ(1); + $core.String get content => $_getSZ(1); @$pb.TagNumber(2) - set fieldId($core.String v) { $_setString(1, v); } + set content($core.String v) { $_setString(1, v); } @$pb.TagNumber(2) - $core.bool hasFieldId() => $_has(1); + $core.bool hasContent() => $_has(1); @$pb.TagNumber(2) - void clearFieldId() => clearField(2); - - @$pb.TagNumber(3) - $core.String get content => $_getSZ(2); - @$pb.TagNumber(3) - set content($core.String v) { $_setString(2, v); } - @$pb.TagNumber(3) - $core.bool hasContent() => $_has(2); - @$pb.TagNumber(3) - void clearContent() => clearField(3); + void clearContent() => clearField(2); } -class CellChangeset extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CellChangeset', createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') - ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId') - ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId') - ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data') +class RepeatedCell extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedCell', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: Cell.create) ..hasRequiredFields = false ; - CellChangeset._() : super(); - factory CellChangeset({ - $core.String? id, - $core.String? rowId, - $core.String? fieldId, - $core.String? data, + RepeatedCell._() : super(); + factory RepeatedCell({ + $core.Iterable? items, }) { final _result = create(); - if (id != null) { - _result.id = id; - } - if (rowId != null) { - _result.rowId = rowId; - } - if (fieldId != null) { - _result.fieldId = fieldId; - } - if (data != null) { - _result.data = data; + if (items != null) { + _result.items.addAll(items); } return _result; } - factory CellChangeset.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory CellChangeset.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + factory RepeatedCell.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RepeatedCell.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Will be removed in next major version') - CellChangeset clone() => CellChangeset()..mergeFromMessage(this); + RepeatedCell clone() => RepeatedCell()..mergeFromMessage(this); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - CellChangeset copyWith(void Function(CellChangeset) updates) => super.copyWith((message) => updates(message as CellChangeset)) as CellChangeset; // ignore: deprecated_member_use + RepeatedCell copyWith(void Function(RepeatedCell) updates) => super.copyWith((message) => updates(message as RepeatedCell)) as RepeatedCell; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static CellChangeset create() => CellChangeset._(); - CellChangeset createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static RepeatedCell create() => RepeatedCell._(); + RepeatedCell createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static CellChangeset getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static CellChangeset? _defaultInstance; + static RepeatedCell getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RepeatedCell? _defaultInstance; @$pb.TagNumber(1) - $core.String get id => $_getSZ(0); - @$pb.TagNumber(1) - set id($core.String v) { $_setString(0, v); } - @$pb.TagNumber(1) - $core.bool hasId() => $_has(0); - @$pb.TagNumber(1) - void clearId() => clearField(1); - - @$pb.TagNumber(2) - $core.String get rowId => $_getSZ(1); - @$pb.TagNumber(2) - set rowId($core.String v) { $_setString(1, v); } - @$pb.TagNumber(2) - $core.bool hasRowId() => $_has(1); - @$pb.TagNumber(2) - void clearRowId() => clearField(2); - - @$pb.TagNumber(3) - $core.String get fieldId => $_getSZ(2); - @$pb.TagNumber(3) - set fieldId($core.String v) { $_setString(2, v); } - @$pb.TagNumber(3) - $core.bool hasFieldId() => $_has(2); - @$pb.TagNumber(3) - void clearFieldId() => clearField(3); - - @$pb.TagNumber(4) - $core.String get data => $_getSZ(3); - @$pb.TagNumber(4) - set data($core.String v) { $_setString(3, v); } - @$pb.TagNumber(4) - $core.bool hasData() => $_has(3); - @$pb.TagNumber(4) - void clearData() => clearField(4); + $core.List get items => $_getList(0); } class CreateGridPayload extends $pb.GeneratedMessage { @@ -1059,6 +858,127 @@ class GridId extends $pb.GeneratedMessage { void clearValue() => clearField(1); } +class GridBlockId extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GridBlockId', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value') + ..hasRequiredFields = false + ; + + GridBlockId._() : super(); + factory GridBlockId({ + $core.String? value, + }) { + final _result = create(); + if (value != null) { + _result.value = value; + } + return _result; + } + factory GridBlockId.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory GridBlockId.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + GridBlockId clone() => GridBlockId()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + GridBlockId copyWith(void Function(GridBlockId) updates) => super.copyWith((message) => updates(message as GridBlockId)) as GridBlockId; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static GridBlockId create() => GridBlockId._(); + GridBlockId createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static GridBlockId getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static GridBlockId? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get value => $_getSZ(0); + @$pb.TagNumber(1) + set value($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasValue() => $_has(0); + @$pb.TagNumber(1) + void clearValue() => clearField(1); +} + +enum CreateRowPayload_OneOfStartRowId { + startRowId, + notSet +} + +class CreateRowPayload extends $pb.GeneratedMessage { + static const $core.Map<$core.int, CreateRowPayload_OneOfStartRowId> _CreateRowPayload_OneOfStartRowIdByTag = { + 2 : CreateRowPayload_OneOfStartRowId.startRowId, + 0 : CreateRowPayload_OneOfStartRowId.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CreateRowPayload', createEmptyInstance: create) + ..oo(0, [2]) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'startRowId') + ..hasRequiredFields = false + ; + + CreateRowPayload._() : super(); + factory CreateRowPayload({ + $core.String? gridId, + $core.String? startRowId, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (startRowId != null) { + _result.startRowId = startRowId; + } + return _result; + } + factory CreateRowPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CreateRowPayload.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CreateRowPayload clone() => CreateRowPayload()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CreateRowPayload copyWith(void Function(CreateRowPayload) updates) => super.copyWith((message) => updates(message as CreateRowPayload)) as CreateRowPayload; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static CreateRowPayload create() => CreateRowPayload._(); + CreateRowPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateRowPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CreateRowPayload? _defaultInstance; + + CreateRowPayload_OneOfStartRowId whichOneOfStartRowId() => _CreateRowPayload_OneOfStartRowIdByTag[$_whichOneof(0)]!; + void clearOneOfStartRowId() => clearField($_whichOneof(0)); + + @$pb.TagNumber(1) + $core.String get gridId => $_getSZ(0); + @$pb.TagNumber(1) + set gridId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasGridId() => $_has(0); + @$pb.TagNumber(1) + void clearGridId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get startRowId => $_getSZ(1); + @$pb.TagNumber(2) + set startRowId($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasStartRowId() => $_has(1); + @$pb.TagNumber(2) + void clearStartRowId() => clearField(2); +} + class QueryFieldPayload extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'QueryFieldPayload', createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') @@ -1122,24 +1042,84 @@ class QueryFieldPayload extends $pb.GeneratedMessage { RepeatedFieldOrder ensureFieldOrders() => $_ensure(1); } +class QueryGridBlocksPayload extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'QueryGridBlocksPayload', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') + ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockOrders', $pb.PbFieldType.PM, subBuilder: GridBlockOrder.create) + ..hasRequiredFields = false + ; + + QueryGridBlocksPayload._() : super(); + factory QueryGridBlocksPayload({ + $core.String? gridId, + $core.Iterable? blockOrders, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (blockOrders != null) { + _result.blockOrders.addAll(blockOrders); + } + return _result; + } + factory QueryGridBlocksPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory QueryGridBlocksPayload.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + QueryGridBlocksPayload clone() => QueryGridBlocksPayload()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + QueryGridBlocksPayload copyWith(void Function(QueryGridBlocksPayload) updates) => super.copyWith((message) => updates(message as QueryGridBlocksPayload)) as QueryGridBlocksPayload; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static QueryGridBlocksPayload create() => QueryGridBlocksPayload._(); + QueryGridBlocksPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static QueryGridBlocksPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static QueryGridBlocksPayload? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get gridId => $_getSZ(0); + @$pb.TagNumber(1) + set gridId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasGridId() => $_has(0); + @$pb.TagNumber(1) + void clearGridId() => clearField(1); + + @$pb.TagNumber(2) + $core.List get blockOrders => $_getList(1); +} + class QueryRowPayload extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'QueryRowPayload', createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') - ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowOrders', subBuilder: RepeatedRowOrder.create) + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId') ..hasRequiredFields = false ; QueryRowPayload._() : super(); factory QueryRowPayload({ $core.String? gridId, - RepeatedRowOrder? rowOrders, + $core.String? blockId, + $core.String? rowId, }) { final _result = create(); if (gridId != null) { _result.gridId = gridId; } - if (rowOrders != null) { - _result.rowOrders = rowOrders; + if (blockId != null) { + _result.blockId = blockId; + } + if (rowId != null) { + _result.rowId = rowId; } return _result; } @@ -1174,14 +1154,21 @@ class QueryRowPayload extends $pb.GeneratedMessage { void clearGridId() => clearField(1); @$pb.TagNumber(2) - RepeatedRowOrder get rowOrders => $_getN(1); + $core.String get blockId => $_getSZ(1); @$pb.TagNumber(2) - set rowOrders(RepeatedRowOrder v) { setField(2, v); } + set blockId($core.String v) { $_setString(1, v); } @$pb.TagNumber(2) - $core.bool hasRowOrders() => $_has(1); + $core.bool hasBlockId() => $_has(1); @$pb.TagNumber(2) - void clearRowOrders() => clearField(2); - @$pb.TagNumber(2) - RepeatedRowOrder ensureRowOrders() => $_ensure(1); + void clearBlockId() => clearField(2); + + @$pb.TagNumber(3) + $core.String get rowId => $_getSZ(2); + @$pb.TagNumber(3) + set rowId($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasRowId() => $_has(2); + @$pb.TagNumber(3) + void clearRowId() => clearField(3); } diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbenum.dart index 661b26532c..0ea2223329 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbenum.dart @@ -5,30 +5,3 @@ // @dart = 2.12 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields -// ignore_for_file: UNDEFINED_SHOWN_NAME -import 'dart:core' as $core; -import 'package:protobuf/protobuf.dart' as $pb; - -class FieldType extends $pb.ProtobufEnum { - static const FieldType RichText = FieldType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RichText'); - static const FieldType Number = FieldType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Number'); - static const FieldType DateTime = FieldType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DateTime'); - static const FieldType SingleSelect = FieldType._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SingleSelect'); - static const FieldType MultiSelect = FieldType._(4, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'MultiSelect'); - static const FieldType Checkbox = FieldType._(5, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Checkbox'); - - static const $core.List values = [ - RichText, - Number, - DateTime, - SingleSelect, - MultiSelect, - Checkbox, - ]; - - static final $core.Map<$core.int, FieldType> _byValue = $pb.ProtobufEnum.initByValue(values); - static FieldType? valueOf($core.int value) => _byValue[value]; - - const FieldType._($core.int v, $core.String n) : super(v, n); -} - diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbjson.dart index 9a97445271..5e24c82178 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbjson.dart @@ -8,54 +8,18 @@ import 'dart:core' as $core; import 'dart:convert' as $convert; import 'dart:typed_data' as $typed_data; -@$core.Deprecated('Use fieldTypeDescriptor instead') -const FieldType$json = const { - '1': 'FieldType', - '2': const [ - const {'1': 'RichText', '2': 0}, - const {'1': 'Number', '2': 1}, - const {'1': 'DateTime', '2': 2}, - const {'1': 'SingleSelect', '2': 3}, - const {'1': 'MultiSelect', '2': 4}, - const {'1': 'Checkbox', '2': 5}, - ], -}; - -/// Descriptor for `FieldType`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List fieldTypeDescriptor = $convert.base64Decode('CglGaWVsZFR5cGUSDAoIUmljaFRleHQQABIKCgZOdW1iZXIQARIMCghEYXRlVGltZRACEhAKDFNpbmdsZVNlbGVjdBADEg8KC011bHRpU2VsZWN0EAQSDAoIQ2hlY2tib3gQBQ=='); @$core.Deprecated('Use gridDescriptor instead') const Grid$json = const { '1': 'Grid', '2': const [ const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, - const {'1': 'field_orders', '3': 2, '4': 1, '5': 11, '6': '.RepeatedFieldOrder', '10': 'fieldOrders'}, - const {'1': 'row_orders', '3': 3, '4': 1, '5': 11, '6': '.RepeatedRowOrder', '10': 'rowOrders'}, + const {'1': 'field_orders', '3': 2, '4': 3, '5': 11, '6': '.FieldOrder', '10': 'fieldOrders'}, + const {'1': 'block_orders', '3': 3, '4': 3, '5': 11, '6': '.GridBlockOrder', '10': 'blockOrders'}, ], }; /// Descriptor for `Grid`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List gridDescriptor = $convert.base64Decode('CgRHcmlkEg4KAmlkGAEgASgJUgJpZBI2CgxmaWVsZF9vcmRlcnMYAiABKAsyEy5SZXBlYXRlZEZpZWxkT3JkZXJSC2ZpZWxkT3JkZXJzEjAKCnJvd19vcmRlcnMYAyABKAsyES5SZXBlYXRlZFJvd09yZGVyUglyb3dPcmRlcnM='); -@$core.Deprecated('Use fieldOrderDescriptor instead') -const FieldOrder$json = const { - '1': 'FieldOrder', - '2': const [ - const {'1': 'field_id', '3': 1, '4': 1, '5': 9, '10': 'fieldId'}, - const {'1': 'visibility', '3': 2, '4': 1, '5': 8, '10': 'visibility'}, - ], -}; - -/// Descriptor for `FieldOrder`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List fieldOrderDescriptor = $convert.base64Decode('CgpGaWVsZE9yZGVyEhkKCGZpZWxkX2lkGAEgASgJUgdmaWVsZElkEh4KCnZpc2liaWxpdHkYAiABKAhSCnZpc2liaWxpdHk='); -@$core.Deprecated('Use repeatedFieldOrderDescriptor instead') -const RepeatedFieldOrder$json = const { - '1': 'RepeatedFieldOrder', - '2': const [ - const {'1': 'items', '3': 1, '4': 3, '5': 11, '6': '.FieldOrder', '10': 'items'}, - ], -}; - -/// Descriptor for `RepeatedFieldOrder`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List repeatedFieldOrderDescriptor = $convert.base64Decode('ChJSZXBlYXRlZEZpZWxkT3JkZXISIQoFaXRlbXMYASADKAsyCy5GaWVsZE9yZGVyUgVpdGVtcw=='); +final $typed_data.Uint8List gridDescriptor = $convert.base64Decode('CgRHcmlkEg4KAmlkGAEgASgJUgJpZBIuCgxmaWVsZF9vcmRlcnMYAiADKAsyCy5GaWVsZE9yZGVyUgtmaWVsZE9yZGVycxIyCgxibG9ja19vcmRlcnMYAyADKAsyDy5HcmlkQmxvY2tPcmRlclILYmxvY2tPcmRlcnM='); @$core.Deprecated('Use fieldDescriptor instead') const Field$json = const { '1': 'Field', @@ -65,13 +29,23 @@ const Field$json = const { const {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'}, const {'1': 'field_type', '3': 4, '4': 1, '5': 14, '6': '.FieldType', '10': 'fieldType'}, const {'1': 'frozen', '3': 5, '4': 1, '5': 8, '10': 'frozen'}, - const {'1': 'width', '3': 6, '4': 1, '5': 5, '10': 'width'}, - const {'1': 'type_options', '3': 7, '4': 1, '5': 11, '6': '.AnyData', '10': 'typeOptions'}, + const {'1': 'visibility', '3': 6, '4': 1, '5': 8, '10': 'visibility'}, + const {'1': 'width', '3': 7, '4': 1, '5': 5, '10': 'width'}, ], }; /// Descriptor for `Field`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List fieldDescriptor = $convert.base64Decode('CgVGaWVsZBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRISCgRkZXNjGAMgASgJUgRkZXNjEikKCmZpZWxkX3R5cGUYBCABKA4yCi5GaWVsZFR5cGVSCWZpZWxkVHlwZRIWCgZmcm96ZW4YBSABKAhSBmZyb3plbhIUCgV3aWR0aBgGIAEoBVIFd2lkdGgSKwoMdHlwZV9vcHRpb25zGAcgASgLMgguQW55RGF0YVILdHlwZU9wdGlvbnM='); +final $typed_data.Uint8List fieldDescriptor = $convert.base64Decode('CgVGaWVsZBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRISCgRkZXNjGAMgASgJUgRkZXNjEikKCmZpZWxkX3R5cGUYBCABKA4yCi5GaWVsZFR5cGVSCWZpZWxkVHlwZRIWCgZmcm96ZW4YBSABKAhSBmZyb3plbhIeCgp2aXNpYmlsaXR5GAYgASgIUgp2aXNpYmlsaXR5EhQKBXdpZHRoGAcgASgFUgV3aWR0aA=='); +@$core.Deprecated('Use fieldOrderDescriptor instead') +const FieldOrder$json = const { + '1': 'FieldOrder', + '2': const [ + const {'1': 'field_id', '3': 1, '4': 1, '5': 9, '10': 'fieldId'}, + ], +}; + +/// Descriptor for `FieldOrder`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List fieldOrderDescriptor = $convert.base64Decode('CgpGaWVsZE9yZGVyEhkKCGZpZWxkX2lkGAEgASgJUgdmaWVsZElk'); @$core.Deprecated('Use repeatedFieldDescriptor instead') const RepeatedField$json = const { '1': 'RepeatedField', @@ -82,91 +56,35 @@ const RepeatedField$json = const { /// Descriptor for `RepeatedField`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List repeatedFieldDescriptor = $convert.base64Decode('Cg1SZXBlYXRlZEZpZWxkEhwKBWl0ZW1zGAEgAygLMgYuRmllbGRSBWl0ZW1z'); -@$core.Deprecated('Use anyDataDescriptor instead') -const AnyData$json = const { - '1': 'AnyData', +@$core.Deprecated('Use repeatedFieldOrderDescriptor instead') +const RepeatedFieldOrder$json = const { + '1': 'RepeatedFieldOrder', '2': const [ - const {'1': 'type_id', '3': 1, '4': 1, '5': 9, '10': 'typeId'}, - const {'1': 'value', '3': 2, '4': 1, '5': 12, '10': 'value'}, + const {'1': 'items', '3': 1, '4': 3, '5': 11, '6': '.FieldOrder', '10': 'items'}, ], }; -/// Descriptor for `AnyData`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List anyDataDescriptor = $convert.base64Decode('CgdBbnlEYXRhEhcKB3R5cGVfaWQYASABKAlSBnR5cGVJZBIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU='); +/// Descriptor for `RepeatedFieldOrder`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List repeatedFieldOrderDescriptor = $convert.base64Decode('ChJSZXBlYXRlZEZpZWxkT3JkZXISIQoFaXRlbXMYASADKAsyCy5GaWVsZE9yZGVyUgVpdGVtcw=='); @$core.Deprecated('Use rowOrderDescriptor instead') const RowOrder$json = const { '1': 'RowOrder', '2': const [ - const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, - const {'1': 'row_id', '3': 2, '4': 1, '5': 9, '10': 'rowId'}, - const {'1': 'visibility', '3': 3, '4': 1, '5': 8, '10': 'visibility'}, + const {'1': 'row_id', '3': 1, '4': 1, '5': 9, '10': 'rowId'}, + const {'1': 'block_id', '3': 2, '4': 1, '5': 9, '10': 'blockId'}, + const {'1': 'height', '3': 3, '4': 1, '5': 5, '10': 'height'}, ], }; /// Descriptor for `RowOrder`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List rowOrderDescriptor = $convert.base64Decode('CghSb3dPcmRlchIXCgdncmlkX2lkGAEgASgJUgZncmlkSWQSFQoGcm93X2lkGAIgASgJUgVyb3dJZBIeCgp2aXNpYmlsaXR5GAMgASgIUgp2aXNpYmlsaXR5'); -@$core.Deprecated('Use repeatedRowOrderDescriptor instead') -const RepeatedRowOrder$json = const { - '1': 'RepeatedRowOrder', - '2': const [ - const {'1': 'items', '3': 1, '4': 3, '5': 11, '6': '.RowOrder', '10': 'items'}, - ], -}; - -/// Descriptor for `RepeatedRowOrder`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List repeatedRowOrderDescriptor = $convert.base64Decode('ChBSZXBlYXRlZFJvd09yZGVyEh8KBWl0ZW1zGAEgAygLMgkuUm93T3JkZXJSBWl0ZW1z'); -@$core.Deprecated('Use rawRowDescriptor instead') -const RawRow$json = const { - '1': 'RawRow', - '2': const [ - const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, - const {'1': 'grid_id', '3': 2, '4': 1, '5': 9, '10': 'gridId'}, - const {'1': 'cell_by_field_id', '3': 3, '4': 3, '5': 11, '6': '.RawRow.CellByFieldIdEntry', '10': 'cellByFieldId'}, - ], - '3': const [RawRow_CellByFieldIdEntry$json], -}; - -@$core.Deprecated('Use rawRowDescriptor instead') -const RawRow_CellByFieldIdEntry$json = const { - '1': 'CellByFieldIdEntry', - '2': const [ - const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, - const {'1': 'value', '3': 2, '4': 1, '5': 11, '6': '.RawCell', '10': 'value'}, - ], - '7': const {'7': true}, -}; - -/// Descriptor for `RawRow`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List rawRowDescriptor = $convert.base64Decode('CgZSYXdSb3cSDgoCaWQYASABKAlSAmlkEhcKB2dyaWRfaWQYAiABKAlSBmdyaWRJZBJDChBjZWxsX2J5X2ZpZWxkX2lkGAMgAygLMhouUmF3Um93LkNlbGxCeUZpZWxkSWRFbnRyeVINY2VsbEJ5RmllbGRJZBpKChJDZWxsQnlGaWVsZElkRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSHgoFdmFsdWUYAiABKAsyCC5SYXdDZWxsUgV2YWx1ZToCOAE='); -@$core.Deprecated('Use rawCellDescriptor instead') -const RawCell$json = const { - '1': 'RawCell', - '2': const [ - const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, - const {'1': 'row_id', '3': 2, '4': 1, '5': 9, '10': 'rowId'}, - const {'1': 'field_id', '3': 3, '4': 1, '5': 9, '10': 'fieldId'}, - const {'1': 'data', '3': 4, '4': 1, '5': 11, '6': '.AnyData', '10': 'data'}, - ], -}; - -/// Descriptor for `RawCell`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List rawCellDescriptor = $convert.base64Decode('CgdSYXdDZWxsEg4KAmlkGAEgASgJUgJpZBIVCgZyb3dfaWQYAiABKAlSBXJvd0lkEhkKCGZpZWxkX2lkGAMgASgJUgdmaWVsZElkEhwKBGRhdGEYBCABKAsyCC5BbnlEYXRhUgRkYXRh'); -@$core.Deprecated('Use repeatedRowDescriptor instead') -const RepeatedRow$json = const { - '1': 'RepeatedRow', - '2': const [ - const {'1': 'items', '3': 1, '4': 3, '5': 11, '6': '.Row', '10': 'items'}, - ], -}; - -/// Descriptor for `RepeatedRow`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List repeatedRowDescriptor = $convert.base64Decode('CgtSZXBlYXRlZFJvdxIaCgVpdGVtcxgBIAMoCzIELlJvd1IFaXRlbXM='); +final $typed_data.Uint8List rowOrderDescriptor = $convert.base64Decode('CghSb3dPcmRlchIVCgZyb3dfaWQYASABKAlSBXJvd0lkEhkKCGJsb2NrX2lkGAIgASgJUgdibG9ja0lkEhYKBmhlaWdodBgDIAEoBVIGaGVpZ2h0'); @$core.Deprecated('Use rowDescriptor instead') const Row$json = const { '1': 'Row', '2': const [ const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, const {'1': 'cell_by_field_id', '3': 2, '4': 3, '5': 11, '6': '.Row.CellByFieldIdEntry', '10': 'cellByFieldId'}, + const {'1': 'height', '3': 3, '4': 1, '5': 5, '10': 'height'}, ], '3': const [Row_CellByFieldIdEntry$json], }; @@ -182,32 +100,69 @@ const Row_CellByFieldIdEntry$json = const { }; /// Descriptor for `Row`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List rowDescriptor = $convert.base64Decode('CgNSb3cSDgoCaWQYASABKAlSAmlkEkAKEGNlbGxfYnlfZmllbGRfaWQYAiADKAsyFy5Sb3cuQ2VsbEJ5RmllbGRJZEVudHJ5Ug1jZWxsQnlGaWVsZElkGkcKEkNlbGxCeUZpZWxkSWRFbnRyeRIQCgNrZXkYASABKAlSA2tleRIbCgV2YWx1ZRgCIAEoCzIFLkNlbGxSBXZhbHVlOgI4AQ=='); +final $typed_data.Uint8List rowDescriptor = $convert.base64Decode('CgNSb3cSDgoCaWQYASABKAlSAmlkEkAKEGNlbGxfYnlfZmllbGRfaWQYAiADKAsyFy5Sb3cuQ2VsbEJ5RmllbGRJZEVudHJ5Ug1jZWxsQnlGaWVsZElkEhYKBmhlaWdodBgDIAEoBVIGaGVpZ2h0GkcKEkNlbGxCeUZpZWxkSWRFbnRyeRIQCgNrZXkYASABKAlSA2tleRIbCgV2YWx1ZRgCIAEoCzIFLkNlbGxSBXZhbHVlOgI4AQ=='); +@$core.Deprecated('Use repeatedRowDescriptor instead') +const RepeatedRow$json = const { + '1': 'RepeatedRow', + '2': const [ + const {'1': 'items', '3': 1, '4': 3, '5': 11, '6': '.Row', '10': 'items'}, + ], +}; + +/// Descriptor for `RepeatedRow`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List repeatedRowDescriptor = $convert.base64Decode('CgtSZXBlYXRlZFJvdxIaCgVpdGVtcxgBIAMoCzIELlJvd1IFaXRlbXM='); +@$core.Deprecated('Use repeatedGridBlockDescriptor instead') +const RepeatedGridBlock$json = const { + '1': 'RepeatedGridBlock', + '2': const [ + const {'1': 'items', '3': 1, '4': 3, '5': 11, '6': '.GridBlock', '10': 'items'}, + ], +}; + +/// Descriptor for `RepeatedGridBlock`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List repeatedGridBlockDescriptor = $convert.base64Decode('ChFSZXBlYXRlZEdyaWRCbG9jaxIgCgVpdGVtcxgBIAMoCzIKLkdyaWRCbG9ja1IFaXRlbXM='); +@$core.Deprecated('Use gridBlockOrderDescriptor instead') +const GridBlockOrder$json = const { + '1': 'GridBlockOrder', + '2': const [ + const {'1': 'block_id', '3': 1, '4': 1, '5': 9, '10': 'blockId'}, + ], +}; + +/// Descriptor for `GridBlockOrder`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List gridBlockOrderDescriptor = $convert.base64Decode('Cg5HcmlkQmxvY2tPcmRlchIZCghibG9ja19pZBgBIAEoCVIHYmxvY2tJZA=='); +@$core.Deprecated('Use gridBlockDescriptor instead') +const GridBlock$json = const { + '1': 'GridBlock', + '2': const [ + const {'1': 'block_id', '3': 1, '4': 1, '5': 9, '10': 'blockId'}, + const {'1': 'row_orders', '3': 2, '4': 3, '5': 11, '6': '.RowOrder', '10': 'rowOrders'}, + ], +}; + +/// Descriptor for `GridBlock`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List gridBlockDescriptor = $convert.base64Decode('CglHcmlkQmxvY2sSGQoIYmxvY2tfaWQYASABKAlSB2Jsb2NrSWQSKAoKcm93X29yZGVycxgCIAMoCzIJLlJvd09yZGVyUglyb3dPcmRlcnM='); @$core.Deprecated('Use cellDescriptor instead') const Cell$json = const { '1': 'Cell', '2': const [ - const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, - const {'1': 'field_id', '3': 2, '4': 1, '5': 9, '10': 'fieldId'}, - const {'1': 'content', '3': 3, '4': 1, '5': 9, '10': 'content'}, + const {'1': 'field_id', '3': 1, '4': 1, '5': 9, '10': 'fieldId'}, + const {'1': 'content', '3': 2, '4': 1, '5': 9, '10': 'content'}, ], }; /// Descriptor for `Cell`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List cellDescriptor = $convert.base64Decode('CgRDZWxsEg4KAmlkGAEgASgJUgJpZBIZCghmaWVsZF9pZBgCIAEoCVIHZmllbGRJZBIYCgdjb250ZW50GAMgASgJUgdjb250ZW50'); -@$core.Deprecated('Use cellChangesetDescriptor instead') -const CellChangeset$json = const { - '1': 'CellChangeset', +final $typed_data.Uint8List cellDescriptor = $convert.base64Decode('CgRDZWxsEhkKCGZpZWxkX2lkGAEgASgJUgdmaWVsZElkEhgKB2NvbnRlbnQYAiABKAlSB2NvbnRlbnQ='); +@$core.Deprecated('Use repeatedCellDescriptor instead') +const RepeatedCell$json = const { + '1': 'RepeatedCell', '2': const [ - const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, - const {'1': 'row_id', '3': 2, '4': 1, '5': 9, '10': 'rowId'}, - const {'1': 'field_id', '3': 3, '4': 1, '5': 9, '10': 'fieldId'}, - const {'1': 'data', '3': 4, '4': 1, '5': 9, '10': 'data'}, + const {'1': 'items', '3': 1, '4': 3, '5': 11, '6': '.Cell', '10': 'items'}, ], }; -/// Descriptor for `CellChangeset`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List cellChangesetDescriptor = $convert.base64Decode('Cg1DZWxsQ2hhbmdlc2V0Eg4KAmlkGAEgASgJUgJpZBIVCgZyb3dfaWQYAiABKAlSBXJvd0lkEhkKCGZpZWxkX2lkGAMgASgJUgdmaWVsZElkEhIKBGRhdGEYBCABKAlSBGRhdGE='); +/// Descriptor for `RepeatedCell`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List repeatedCellDescriptor = $convert.base64Decode('CgxSZXBlYXRlZENlbGwSGwoFaXRlbXMYASADKAsyBS5DZWxsUgVpdGVtcw=='); @$core.Deprecated('Use createGridPayloadDescriptor instead') const CreateGridPayload$json = const { '1': 'CreateGridPayload', @@ -228,6 +183,30 @@ const GridId$json = const { /// Descriptor for `GridId`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List gridIdDescriptor = $convert.base64Decode('CgZHcmlkSWQSFAoFdmFsdWUYASABKAlSBXZhbHVl'); +@$core.Deprecated('Use gridBlockIdDescriptor instead') +const GridBlockId$json = const { + '1': 'GridBlockId', + '2': const [ + const {'1': 'value', '3': 1, '4': 1, '5': 9, '10': 'value'}, + ], +}; + +/// Descriptor for `GridBlockId`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List gridBlockIdDescriptor = $convert.base64Decode('CgtHcmlkQmxvY2tJZBIUCgV2YWx1ZRgBIAEoCVIFdmFsdWU='); +@$core.Deprecated('Use createRowPayloadDescriptor instead') +const CreateRowPayload$json = const { + '1': 'CreateRowPayload', + '2': const [ + const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, + const {'1': 'start_row_id', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'startRowId'}, + ], + '8': const [ + const {'1': 'one_of_start_row_id'}, + ], +}; + +/// Descriptor for `CreateRowPayload`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List createRowPayloadDescriptor = $convert.base64Decode('ChBDcmVhdGVSb3dQYXlsb2FkEhcKB2dyaWRfaWQYASABKAlSBmdyaWRJZBIiCgxzdGFydF9yb3dfaWQYAiABKAlIAFIKc3RhcnRSb3dJZEIVChNvbmVfb2Zfc3RhcnRfcm93X2lk'); @$core.Deprecated('Use queryFieldPayloadDescriptor instead') const QueryFieldPayload$json = const { '1': 'QueryFieldPayload', @@ -239,14 +218,26 @@ const QueryFieldPayload$json = const { /// Descriptor for `QueryFieldPayload`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List queryFieldPayloadDescriptor = $convert.base64Decode('ChFRdWVyeUZpZWxkUGF5bG9hZBIXCgdncmlkX2lkGAEgASgJUgZncmlkSWQSNgoMZmllbGRfb3JkZXJzGAIgASgLMhMuUmVwZWF0ZWRGaWVsZE9yZGVyUgtmaWVsZE9yZGVycw=='); +@$core.Deprecated('Use queryGridBlocksPayloadDescriptor instead') +const QueryGridBlocksPayload$json = const { + '1': 'QueryGridBlocksPayload', + '2': const [ + const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, + const {'1': 'block_orders', '3': 2, '4': 3, '5': 11, '6': '.GridBlockOrder', '10': 'blockOrders'}, + ], +}; + +/// Descriptor for `QueryGridBlocksPayload`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List queryGridBlocksPayloadDescriptor = $convert.base64Decode('ChZRdWVyeUdyaWRCbG9ja3NQYXlsb2FkEhcKB2dyaWRfaWQYASABKAlSBmdyaWRJZBIyCgxibG9ja19vcmRlcnMYAiADKAsyDy5HcmlkQmxvY2tPcmRlclILYmxvY2tPcmRlcnM='); @$core.Deprecated('Use queryRowPayloadDescriptor instead') const QueryRowPayload$json = const { '1': 'QueryRowPayload', '2': const [ const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, - const {'1': 'row_orders', '3': 2, '4': 1, '5': 11, '6': '.RepeatedRowOrder', '10': 'rowOrders'}, + const {'1': 'block_id', '3': 2, '4': 1, '5': 9, '10': 'blockId'}, + const {'1': 'row_id', '3': 3, '4': 1, '5': 9, '10': 'rowId'}, ], }; /// Descriptor for `QueryRowPayload`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List queryRowPayloadDescriptor = $convert.base64Decode('Cg9RdWVyeVJvd1BheWxvYWQSFwoHZ3JpZF9pZBgBIAEoCVIGZ3JpZElkEjAKCnJvd19vcmRlcnMYAiABKAsyES5SZXBlYXRlZFJvd09yZGVyUglyb3dPcmRlcnM='); +final $typed_data.Uint8List queryRowPayloadDescriptor = $convert.base64Decode('Cg9RdWVyeVJvd1BheWxvYWQSFwoHZ3JpZF9pZBgBIAEoCVIGZ3JpZElkEhkKCGJsb2NrX2lkGAIgASgJUgdibG9ja0lkEhUKBnJvd19pZBgDIAEoCVIFcm93SWQ='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pb.dart new file mode 100644 index 0000000000..4bbeae52a5 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pb.dart @@ -0,0 +1,1092 @@ +/// +// Generated code. Do not modify. +// source: meta.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +import 'meta.pbenum.dart'; + +export 'meta.pbenum.dart'; + +class GridMeta extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GridMeta', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') + ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fields', $pb.PbFieldType.PM, subBuilder: FieldMeta.create) + ..pc(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockMetas', $pb.PbFieldType.PM, subBuilder: GridBlockMeta.create) + ..hasRequiredFields = false + ; + + GridMeta._() : super(); + factory GridMeta({ + $core.String? gridId, + $core.Iterable? fields, + $core.Iterable? blockMetas, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (fields != null) { + _result.fields.addAll(fields); + } + if (blockMetas != null) { + _result.blockMetas.addAll(blockMetas); + } + return _result; + } + factory GridMeta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory GridMeta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + GridMeta clone() => GridMeta()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + GridMeta copyWith(void Function(GridMeta) updates) => super.copyWith((message) => updates(message as GridMeta)) as GridMeta; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static GridMeta create() => GridMeta._(); + GridMeta createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static GridMeta getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static GridMeta? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get gridId => $_getSZ(0); + @$pb.TagNumber(1) + set gridId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasGridId() => $_has(0); + @$pb.TagNumber(1) + void clearGridId() => clearField(1); + + @$pb.TagNumber(2) + $core.List get fields => $_getList(1); + + @$pb.TagNumber(3) + $core.List get blockMetas => $_getList(2); +} + +class GridBlockMeta extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GridBlockMeta', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') + ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'startRowIndex', $pb.PbFieldType.O3) + ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowCount', $pb.PbFieldType.O3) + ..hasRequiredFields = false + ; + + GridBlockMeta._() : super(); + factory GridBlockMeta({ + $core.String? blockId, + $core.int? startRowIndex, + $core.int? rowCount, + }) { + final _result = create(); + if (blockId != null) { + _result.blockId = blockId; + } + if (startRowIndex != null) { + _result.startRowIndex = startRowIndex; + } + if (rowCount != null) { + _result.rowCount = rowCount; + } + return _result; + } + factory GridBlockMeta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory GridBlockMeta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + GridBlockMeta clone() => GridBlockMeta()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + GridBlockMeta copyWith(void Function(GridBlockMeta) updates) => super.copyWith((message) => updates(message as GridBlockMeta)) as GridBlockMeta; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static GridBlockMeta create() => GridBlockMeta._(); + GridBlockMeta createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static GridBlockMeta getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static GridBlockMeta? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get blockId => $_getSZ(0); + @$pb.TagNumber(1) + set blockId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasBlockId() => $_has(0); + @$pb.TagNumber(1) + void clearBlockId() => clearField(1); + + @$pb.TagNumber(2) + $core.int get startRowIndex => $_getIZ(1); + @$pb.TagNumber(2) + set startRowIndex($core.int v) { $_setSignedInt32(1, v); } + @$pb.TagNumber(2) + $core.bool hasStartRowIndex() => $_has(1); + @$pb.TagNumber(2) + void clearStartRowIndex() => clearField(2); + + @$pb.TagNumber(3) + $core.int get rowCount => $_getIZ(2); + @$pb.TagNumber(3) + set rowCount($core.int v) { $_setSignedInt32(2, v); } + @$pb.TagNumber(3) + $core.bool hasRowCount() => $_has(2); + @$pb.TagNumber(3) + void clearRowCount() => clearField(3); +} + +class GridBlockMetaSerde extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GridBlockMetaSerde', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') + ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowMetas', $pb.PbFieldType.PM, subBuilder: RowMeta.create) + ..hasRequiredFields = false + ; + + GridBlockMetaSerde._() : super(); + factory GridBlockMetaSerde({ + $core.String? blockId, + $core.Iterable? rowMetas, + }) { + final _result = create(); + if (blockId != null) { + _result.blockId = blockId; + } + if (rowMetas != null) { + _result.rowMetas.addAll(rowMetas); + } + return _result; + } + factory GridBlockMetaSerde.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory GridBlockMetaSerde.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + GridBlockMetaSerde clone() => GridBlockMetaSerde()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + GridBlockMetaSerde copyWith(void Function(GridBlockMetaSerde) updates) => super.copyWith((message) => updates(message as GridBlockMetaSerde)) as GridBlockMetaSerde; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static GridBlockMetaSerde create() => GridBlockMetaSerde._(); + GridBlockMetaSerde createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static GridBlockMetaSerde getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static GridBlockMetaSerde? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get blockId => $_getSZ(0); + @$pb.TagNumber(1) + set blockId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasBlockId() => $_has(0); + @$pb.TagNumber(1) + void clearBlockId() => clearField(1); + + @$pb.TagNumber(2) + $core.List get rowMetas => $_getList(1); +} + +class FieldMeta extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FieldMeta', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc') + ..e(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: FieldType.RichText, valueOf: FieldType.valueOf, enumValues: FieldType.values) + ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'frozen') + ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility') + ..a<$core.int>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.O3) + ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeOptions') + ..hasRequiredFields = false + ; + + FieldMeta._() : super(); + factory FieldMeta({ + $core.String? id, + $core.String? name, + $core.String? desc, + FieldType? fieldType, + $core.bool? frozen, + $core.bool? visibility, + $core.int? width, + $core.String? typeOptions, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (name != null) { + _result.name = name; + } + if (desc != null) { + _result.desc = desc; + } + if (fieldType != null) { + _result.fieldType = fieldType; + } + if (frozen != null) { + _result.frozen = frozen; + } + if (visibility != null) { + _result.visibility = visibility; + } + if (width != null) { + _result.width = width; + } + if (typeOptions != null) { + _result.typeOptions = typeOptions; + } + return _result; + } + factory FieldMeta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory FieldMeta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + FieldMeta clone() => FieldMeta()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + FieldMeta copyWith(void Function(FieldMeta) updates) => super.copyWith((message) => updates(message as FieldMeta)) as FieldMeta; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static FieldMeta create() => FieldMeta._(); + FieldMeta createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static FieldMeta getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static FieldMeta? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get name => $_getSZ(1); + @$pb.TagNumber(2) + set name($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasName() => $_has(1); + @$pb.TagNumber(2) + void clearName() => clearField(2); + + @$pb.TagNumber(3) + $core.String get desc => $_getSZ(2); + @$pb.TagNumber(3) + set desc($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasDesc() => $_has(2); + @$pb.TagNumber(3) + void clearDesc() => clearField(3); + + @$pb.TagNumber(4) + FieldType get fieldType => $_getN(3); + @$pb.TagNumber(4) + set fieldType(FieldType v) { setField(4, v); } + @$pb.TagNumber(4) + $core.bool hasFieldType() => $_has(3); + @$pb.TagNumber(4) + void clearFieldType() => clearField(4); + + @$pb.TagNumber(5) + $core.bool get frozen => $_getBF(4); + @$pb.TagNumber(5) + set frozen($core.bool v) { $_setBool(4, v); } + @$pb.TagNumber(5) + $core.bool hasFrozen() => $_has(4); + @$pb.TagNumber(5) + void clearFrozen() => clearField(5); + + @$pb.TagNumber(6) + $core.bool get visibility => $_getBF(5); + @$pb.TagNumber(6) + set visibility($core.bool v) { $_setBool(5, v); } + @$pb.TagNumber(6) + $core.bool hasVisibility() => $_has(5); + @$pb.TagNumber(6) + void clearVisibility() => clearField(6); + + @$pb.TagNumber(7) + $core.int get width => $_getIZ(6); + @$pb.TagNumber(7) + set width($core.int v) { $_setSignedInt32(6, v); } + @$pb.TagNumber(7) + $core.bool hasWidth() => $_has(6); + @$pb.TagNumber(7) + void clearWidth() => clearField(7); + + @$pb.TagNumber(8) + $core.String get typeOptions => $_getSZ(7); + @$pb.TagNumber(8) + set typeOptions($core.String v) { $_setString(7, v); } + @$pb.TagNumber(8) + $core.bool hasTypeOptions() => $_has(7); + @$pb.TagNumber(8) + void clearTypeOptions() => clearField(8); +} + +enum FieldChangeset_OneOfName { + name, + notSet +} + +enum FieldChangeset_OneOfDesc { + desc, + notSet +} + +enum FieldChangeset_OneOfFieldType { + fieldType, + notSet +} + +enum FieldChangeset_OneOfFrozen { + frozen, + notSet +} + +enum FieldChangeset_OneOfVisibility { + visibility, + notSet +} + +enum FieldChangeset_OneOfWidth { + width, + notSet +} + +enum FieldChangeset_OneOfTypeOptions { + typeOptions, + notSet +} + +class FieldChangeset extends $pb.GeneratedMessage { + static const $core.Map<$core.int, FieldChangeset_OneOfName> _FieldChangeset_OneOfNameByTag = { + 2 : FieldChangeset_OneOfName.name, + 0 : FieldChangeset_OneOfName.notSet + }; + static const $core.Map<$core.int, FieldChangeset_OneOfDesc> _FieldChangeset_OneOfDescByTag = { + 3 : FieldChangeset_OneOfDesc.desc, + 0 : FieldChangeset_OneOfDesc.notSet + }; + static const $core.Map<$core.int, FieldChangeset_OneOfFieldType> _FieldChangeset_OneOfFieldTypeByTag = { + 4 : FieldChangeset_OneOfFieldType.fieldType, + 0 : FieldChangeset_OneOfFieldType.notSet + }; + static const $core.Map<$core.int, FieldChangeset_OneOfFrozen> _FieldChangeset_OneOfFrozenByTag = { + 5 : FieldChangeset_OneOfFrozen.frozen, + 0 : FieldChangeset_OneOfFrozen.notSet + }; + static const $core.Map<$core.int, FieldChangeset_OneOfVisibility> _FieldChangeset_OneOfVisibilityByTag = { + 6 : FieldChangeset_OneOfVisibility.visibility, + 0 : FieldChangeset_OneOfVisibility.notSet + }; + static const $core.Map<$core.int, FieldChangeset_OneOfWidth> _FieldChangeset_OneOfWidthByTag = { + 7 : FieldChangeset_OneOfWidth.width, + 0 : FieldChangeset_OneOfWidth.notSet + }; + static const $core.Map<$core.int, FieldChangeset_OneOfTypeOptions> _FieldChangeset_OneOfTypeOptionsByTag = { + 8 : FieldChangeset_OneOfTypeOptions.typeOptions, + 0 : FieldChangeset_OneOfTypeOptions.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FieldChangeset', createEmptyInstance: create) + ..oo(0, [2]) + ..oo(1, [3]) + ..oo(2, [4]) + ..oo(3, [5]) + ..oo(4, [6]) + ..oo(5, [7]) + ..oo(6, [8]) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc') + ..e(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: FieldType.RichText, valueOf: FieldType.valueOf, enumValues: FieldType.values) + ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'frozen') + ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility') + ..a<$core.int>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.O3) + ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeOptions') + ..hasRequiredFields = false + ; + + FieldChangeset._() : super(); + factory FieldChangeset({ + $core.String? fieldId, + $core.String? name, + $core.String? desc, + FieldType? fieldType, + $core.bool? frozen, + $core.bool? visibility, + $core.int? width, + $core.String? typeOptions, + }) { + final _result = create(); + if (fieldId != null) { + _result.fieldId = fieldId; + } + if (name != null) { + _result.name = name; + } + if (desc != null) { + _result.desc = desc; + } + if (fieldType != null) { + _result.fieldType = fieldType; + } + if (frozen != null) { + _result.frozen = frozen; + } + if (visibility != null) { + _result.visibility = visibility; + } + if (width != null) { + _result.width = width; + } + if (typeOptions != null) { + _result.typeOptions = typeOptions; + } + return _result; + } + factory FieldChangeset.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory FieldChangeset.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + FieldChangeset clone() => FieldChangeset()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + FieldChangeset copyWith(void Function(FieldChangeset) updates) => super.copyWith((message) => updates(message as FieldChangeset)) as FieldChangeset; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static FieldChangeset create() => FieldChangeset._(); + FieldChangeset createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static FieldChangeset getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static FieldChangeset? _defaultInstance; + + FieldChangeset_OneOfName whichOneOfName() => _FieldChangeset_OneOfNameByTag[$_whichOneof(0)]!; + void clearOneOfName() => clearField($_whichOneof(0)); + + FieldChangeset_OneOfDesc whichOneOfDesc() => _FieldChangeset_OneOfDescByTag[$_whichOneof(1)]!; + void clearOneOfDesc() => clearField($_whichOneof(1)); + + FieldChangeset_OneOfFieldType whichOneOfFieldType() => _FieldChangeset_OneOfFieldTypeByTag[$_whichOneof(2)]!; + void clearOneOfFieldType() => clearField($_whichOneof(2)); + + FieldChangeset_OneOfFrozen whichOneOfFrozen() => _FieldChangeset_OneOfFrozenByTag[$_whichOneof(3)]!; + void clearOneOfFrozen() => clearField($_whichOneof(3)); + + FieldChangeset_OneOfVisibility whichOneOfVisibility() => _FieldChangeset_OneOfVisibilityByTag[$_whichOneof(4)]!; + void clearOneOfVisibility() => clearField($_whichOneof(4)); + + FieldChangeset_OneOfWidth whichOneOfWidth() => _FieldChangeset_OneOfWidthByTag[$_whichOneof(5)]!; + void clearOneOfWidth() => clearField($_whichOneof(5)); + + FieldChangeset_OneOfTypeOptions whichOneOfTypeOptions() => _FieldChangeset_OneOfTypeOptionsByTag[$_whichOneof(6)]!; + void clearOneOfTypeOptions() => clearField($_whichOneof(6)); + + @$pb.TagNumber(1) + $core.String get fieldId => $_getSZ(0); + @$pb.TagNumber(1) + set fieldId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasFieldId() => $_has(0); + @$pb.TagNumber(1) + void clearFieldId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get name => $_getSZ(1); + @$pb.TagNumber(2) + set name($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasName() => $_has(1); + @$pb.TagNumber(2) + void clearName() => clearField(2); + + @$pb.TagNumber(3) + $core.String get desc => $_getSZ(2); + @$pb.TagNumber(3) + set desc($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasDesc() => $_has(2); + @$pb.TagNumber(3) + void clearDesc() => clearField(3); + + @$pb.TagNumber(4) + FieldType get fieldType => $_getN(3); + @$pb.TagNumber(4) + set fieldType(FieldType v) { setField(4, v); } + @$pb.TagNumber(4) + $core.bool hasFieldType() => $_has(3); + @$pb.TagNumber(4) + void clearFieldType() => clearField(4); + + @$pb.TagNumber(5) + $core.bool get frozen => $_getBF(4); + @$pb.TagNumber(5) + set frozen($core.bool v) { $_setBool(4, v); } + @$pb.TagNumber(5) + $core.bool hasFrozen() => $_has(4); + @$pb.TagNumber(5) + void clearFrozen() => clearField(5); + + @$pb.TagNumber(6) + $core.bool get visibility => $_getBF(5); + @$pb.TagNumber(6) + set visibility($core.bool v) { $_setBool(5, v); } + @$pb.TagNumber(6) + $core.bool hasVisibility() => $_has(5); + @$pb.TagNumber(6) + void clearVisibility() => clearField(6); + + @$pb.TagNumber(7) + $core.int get width => $_getIZ(6); + @$pb.TagNumber(7) + set width($core.int v) { $_setSignedInt32(6, v); } + @$pb.TagNumber(7) + $core.bool hasWidth() => $_has(6); + @$pb.TagNumber(7) + void clearWidth() => clearField(7); + + @$pb.TagNumber(8) + $core.String get typeOptions => $_getSZ(7); + @$pb.TagNumber(8) + set typeOptions($core.String v) { $_setString(7, v); } + @$pb.TagNumber(8) + $core.bool hasTypeOptions() => $_has(7); + @$pb.TagNumber(8) + void clearTypeOptions() => clearField(8); +} + +class AnyData extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AnyData', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeId') + ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + AnyData._() : super(); + factory AnyData({ + $core.String? typeId, + $core.List<$core.int>? value, + }) { + final _result = create(); + if (typeId != null) { + _result.typeId = typeId; + } + if (value != null) { + _result.value = value; + } + return _result; + } + factory AnyData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory AnyData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + AnyData clone() => AnyData()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + AnyData copyWith(void Function(AnyData) updates) => super.copyWith((message) => updates(message as AnyData)) as AnyData; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static AnyData create() => AnyData._(); + AnyData createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static AnyData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static AnyData? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get typeId => $_getSZ(0); + @$pb.TagNumber(1) + set typeId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasTypeId() => $_has(0); + @$pb.TagNumber(1) + void clearTypeId() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get value => $_getN(1); + @$pb.TagNumber(2) + set value($core.List<$core.int> v) { $_setBytes(1, v); } + @$pb.TagNumber(2) + $core.bool hasValue() => $_has(1); + @$pb.TagNumber(2) + void clearValue() => clearField(2); +} + +class RowMeta extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RowMeta', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') + ..m<$core.String, CellMeta>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cellByFieldId', entryClassName: 'RowMeta.CellByFieldIdEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OM, valueCreator: CellMeta.create) + ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', $pb.PbFieldType.O3) + ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility') + ..hasRequiredFields = false + ; + + RowMeta._() : super(); + factory RowMeta({ + $core.String? id, + $core.String? blockId, + $core.Map<$core.String, CellMeta>? cellByFieldId, + $core.int? height, + $core.bool? visibility, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (blockId != null) { + _result.blockId = blockId; + } + if (cellByFieldId != null) { + _result.cellByFieldId.addAll(cellByFieldId); + } + if (height != null) { + _result.height = height; + } + if (visibility != null) { + _result.visibility = visibility; + } + return _result; + } + factory RowMeta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RowMeta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + RowMeta clone() => RowMeta()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RowMeta copyWith(void Function(RowMeta) updates) => super.copyWith((message) => updates(message as RowMeta)) as RowMeta; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static RowMeta create() => RowMeta._(); + RowMeta createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RowMeta getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RowMeta? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get blockId => $_getSZ(1); + @$pb.TagNumber(2) + set blockId($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasBlockId() => $_has(1); + @$pb.TagNumber(2) + void clearBlockId() => clearField(2); + + @$pb.TagNumber(3) + $core.Map<$core.String, CellMeta> get cellByFieldId => $_getMap(2); + + @$pb.TagNumber(4) + $core.int get height => $_getIZ(3); + @$pb.TagNumber(4) + set height($core.int v) { $_setSignedInt32(3, v); } + @$pb.TagNumber(4) + $core.bool hasHeight() => $_has(3); + @$pb.TagNumber(4) + void clearHeight() => clearField(4); + + @$pb.TagNumber(5) + $core.bool get visibility => $_getBF(4); + @$pb.TagNumber(5) + set visibility($core.bool v) { $_setBool(4, v); } + @$pb.TagNumber(5) + $core.bool hasVisibility() => $_has(4); + @$pb.TagNumber(5) + void clearVisibility() => clearField(5); +} + +enum RowMetaChangeset_OneOfHeight { + height, + notSet +} + +enum RowMetaChangeset_OneOfVisibility { + visibility, + notSet +} + +class RowMetaChangeset extends $pb.GeneratedMessage { + static const $core.Map<$core.int, RowMetaChangeset_OneOfHeight> _RowMetaChangeset_OneOfHeightByTag = { + 2 : RowMetaChangeset_OneOfHeight.height, + 0 : RowMetaChangeset_OneOfHeight.notSet + }; + static const $core.Map<$core.int, RowMetaChangeset_OneOfVisibility> _RowMetaChangeset_OneOfVisibilityByTag = { + 3 : RowMetaChangeset_OneOfVisibility.visibility, + 0 : RowMetaChangeset_OneOfVisibility.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RowMetaChangeset', createEmptyInstance: create) + ..oo(0, [2]) + ..oo(1, [3]) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId') + ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', $pb.PbFieldType.O3) + ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility') + ..m<$core.String, CellMeta>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cellByFieldId', entryClassName: 'RowMetaChangeset.CellByFieldIdEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OM, valueCreator: CellMeta.create) + ..hasRequiredFields = false + ; + + RowMetaChangeset._() : super(); + factory RowMetaChangeset({ + $core.String? rowId, + $core.int? height, + $core.bool? visibility, + $core.Map<$core.String, CellMeta>? cellByFieldId, + }) { + final _result = create(); + if (rowId != null) { + _result.rowId = rowId; + } + if (height != null) { + _result.height = height; + } + if (visibility != null) { + _result.visibility = visibility; + } + if (cellByFieldId != null) { + _result.cellByFieldId.addAll(cellByFieldId); + } + return _result; + } + factory RowMetaChangeset.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RowMetaChangeset.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + RowMetaChangeset clone() => RowMetaChangeset()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RowMetaChangeset copyWith(void Function(RowMetaChangeset) updates) => super.copyWith((message) => updates(message as RowMetaChangeset)) as RowMetaChangeset; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static RowMetaChangeset create() => RowMetaChangeset._(); + RowMetaChangeset createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RowMetaChangeset getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RowMetaChangeset? _defaultInstance; + + RowMetaChangeset_OneOfHeight whichOneOfHeight() => _RowMetaChangeset_OneOfHeightByTag[$_whichOneof(0)]!; + void clearOneOfHeight() => clearField($_whichOneof(0)); + + RowMetaChangeset_OneOfVisibility whichOneOfVisibility() => _RowMetaChangeset_OneOfVisibilityByTag[$_whichOneof(1)]!; + void clearOneOfVisibility() => clearField($_whichOneof(1)); + + @$pb.TagNumber(1) + $core.String get rowId => $_getSZ(0); + @$pb.TagNumber(1) + set rowId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasRowId() => $_has(0); + @$pb.TagNumber(1) + void clearRowId() => clearField(1); + + @$pb.TagNumber(2) + $core.int get height => $_getIZ(1); + @$pb.TagNumber(2) + set height($core.int v) { $_setSignedInt32(1, v); } + @$pb.TagNumber(2) + $core.bool hasHeight() => $_has(1); + @$pb.TagNumber(2) + void clearHeight() => clearField(2); + + @$pb.TagNumber(3) + $core.bool get visibility => $_getBF(2); + @$pb.TagNumber(3) + set visibility($core.bool v) { $_setBool(2, v); } + @$pb.TagNumber(3) + $core.bool hasVisibility() => $_has(2); + @$pb.TagNumber(3) + void clearVisibility() => clearField(3); + + @$pb.TagNumber(4) + $core.Map<$core.String, CellMeta> get cellByFieldId => $_getMap(3); +} + +class CellMeta extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CellMeta', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data') + ..hasRequiredFields = false + ; + + CellMeta._() : super(); + factory CellMeta({ + $core.String? fieldId, + $core.String? data, + }) { + final _result = create(); + if (fieldId != null) { + _result.fieldId = fieldId; + } + if (data != null) { + _result.data = data; + } + return _result; + } + factory CellMeta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CellMeta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CellMeta clone() => CellMeta()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CellMeta copyWith(void Function(CellMeta) updates) => super.copyWith((message) => updates(message as CellMeta)) as CellMeta; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static CellMeta create() => CellMeta._(); + CellMeta createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CellMeta getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CellMeta? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get fieldId => $_getSZ(0); + @$pb.TagNumber(1) + set fieldId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasFieldId() => $_has(0); + @$pb.TagNumber(1) + void clearFieldId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get data => $_getSZ(1); + @$pb.TagNumber(2) + set data($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasData() => $_has(1); + @$pb.TagNumber(2) + void clearData() => clearField(2); +} + +enum CellMetaChangeset_OneOfData { + data, + notSet +} + +class CellMetaChangeset extends $pb.GeneratedMessage { + static const $core.Map<$core.int, CellMetaChangeset_OneOfData> _CellMetaChangeset_OneOfDataByTag = { + 4 : CellMetaChangeset_OneOfData.data, + 0 : CellMetaChangeset_OneOfData.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CellMetaChangeset', createEmptyInstance: create) + ..oo(0, [4]) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId') + ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data') + ..hasRequiredFields = false + ; + + CellMetaChangeset._() : super(); + factory CellMetaChangeset({ + $core.String? gridId, + $core.String? rowId, + $core.String? fieldId, + $core.String? data, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (rowId != null) { + _result.rowId = rowId; + } + if (fieldId != null) { + _result.fieldId = fieldId; + } + if (data != null) { + _result.data = data; + } + return _result; + } + factory CellMetaChangeset.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CellMetaChangeset.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CellMetaChangeset clone() => CellMetaChangeset()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CellMetaChangeset copyWith(void Function(CellMetaChangeset) updates) => super.copyWith((message) => updates(message as CellMetaChangeset)) as CellMetaChangeset; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static CellMetaChangeset create() => CellMetaChangeset._(); + CellMetaChangeset createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CellMetaChangeset getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CellMetaChangeset? _defaultInstance; + + CellMetaChangeset_OneOfData whichOneOfData() => _CellMetaChangeset_OneOfDataByTag[$_whichOneof(0)]!; + void clearOneOfData() => clearField($_whichOneof(0)); + + @$pb.TagNumber(1) + $core.String get gridId => $_getSZ(0); + @$pb.TagNumber(1) + set gridId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasGridId() => $_has(0); + @$pb.TagNumber(1) + void clearGridId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get rowId => $_getSZ(1); + @$pb.TagNumber(2) + set rowId($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasRowId() => $_has(1); + @$pb.TagNumber(2) + void clearRowId() => clearField(2); + + @$pb.TagNumber(3) + $core.String get fieldId => $_getSZ(2); + @$pb.TagNumber(3) + set fieldId($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasFieldId() => $_has(2); + @$pb.TagNumber(3) + void clearFieldId() => clearField(3); + + @$pb.TagNumber(4) + $core.String get data => $_getSZ(3); + @$pb.TagNumber(4) + set data($core.String v) { $_setString(3, v); } + @$pb.TagNumber(4) + $core.bool hasData() => $_has(3); + @$pb.TagNumber(4) + void clearData() => clearField(4); +} + +class BuildGridContext extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildGridContext', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldMetas', $pb.PbFieldType.PM, subBuilder: FieldMeta.create) + ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockMetas', subBuilder: GridBlockMeta.create) + ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockMetaData', subBuilder: GridBlockMetaSerde.create) + ..hasRequiredFields = false + ; + + BuildGridContext._() : super(); + factory BuildGridContext({ + $core.Iterable? fieldMetas, + GridBlockMeta? blockMetas, + GridBlockMetaSerde? blockMetaData, + }) { + final _result = create(); + if (fieldMetas != null) { + _result.fieldMetas.addAll(fieldMetas); + } + if (blockMetas != null) { + _result.blockMetas = blockMetas; + } + if (blockMetaData != null) { + _result.blockMetaData = blockMetaData; + } + return _result; + } + factory BuildGridContext.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory BuildGridContext.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + BuildGridContext clone() => BuildGridContext()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + BuildGridContext copyWith(void Function(BuildGridContext) updates) => super.copyWith((message) => updates(message as BuildGridContext)) as BuildGridContext; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static BuildGridContext create() => BuildGridContext._(); + BuildGridContext createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static BuildGridContext getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static BuildGridContext? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get fieldMetas => $_getList(0); + + @$pb.TagNumber(2) + GridBlockMeta get blockMetas => $_getN(1); + @$pb.TagNumber(2) + set blockMetas(GridBlockMeta v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasBlockMetas() => $_has(1); + @$pb.TagNumber(2) + void clearBlockMetas() => clearField(2); + @$pb.TagNumber(2) + GridBlockMeta ensureBlockMetas() => $_ensure(1); + + @$pb.TagNumber(3) + GridBlockMetaSerde get blockMetaData => $_getN(2); + @$pb.TagNumber(3) + set blockMetaData(GridBlockMetaSerde v) { setField(3, v); } + @$pb.TagNumber(3) + $core.bool hasBlockMetaData() => $_has(2); + @$pb.TagNumber(3) + void clearBlockMetaData() => clearField(3); + @$pb.TagNumber(3) + GridBlockMetaSerde ensureBlockMetaData() => $_ensure(2); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbenum.dart new file mode 100644 index 0000000000..2bb3da475b --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbenum.dart @@ -0,0 +1,34 @@ +/// +// Generated code. Do not modify. +// source: meta.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +// ignore_for_file: UNDEFINED_SHOWN_NAME +import 'dart:core' as $core; +import 'package:protobuf/protobuf.dart' as $pb; + +class FieldType extends $pb.ProtobufEnum { + static const FieldType RichText = FieldType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RichText'); + static const FieldType Number = FieldType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Number'); + static const FieldType DateTime = FieldType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DateTime'); + static const FieldType SingleSelect = FieldType._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SingleSelect'); + static const FieldType MultiSelect = FieldType._(4, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'MultiSelect'); + static const FieldType Checkbox = FieldType._(5, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Checkbox'); + + static const $core.List values = [ + RichText, + Number, + DateTime, + SingleSelect, + MultiSelect, + Checkbox, + ]; + + static final $core.Map<$core.int, FieldType> _byValue = $pb.ProtobufEnum.initByValue(values); + static FieldType? valueOf($core.int value) => _byValue[value]; + + const FieldType._($core.int v, $core.String n) : super(v, n); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbjson.dart new file mode 100644 index 0000000000..d20b9da3f5 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbjson.dart @@ -0,0 +1,206 @@ +/// +// Generated code. Do not modify. +// source: meta.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use fieldTypeDescriptor instead') +const FieldType$json = const { + '1': 'FieldType', + '2': const [ + const {'1': 'RichText', '2': 0}, + const {'1': 'Number', '2': 1}, + const {'1': 'DateTime', '2': 2}, + const {'1': 'SingleSelect', '2': 3}, + const {'1': 'MultiSelect', '2': 4}, + const {'1': 'Checkbox', '2': 5}, + ], +}; + +/// Descriptor for `FieldType`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List fieldTypeDescriptor = $convert.base64Decode('CglGaWVsZFR5cGUSDAoIUmljaFRleHQQABIKCgZOdW1iZXIQARIMCghEYXRlVGltZRACEhAKDFNpbmdsZVNlbGVjdBADEg8KC011bHRpU2VsZWN0EAQSDAoIQ2hlY2tib3gQBQ=='); +@$core.Deprecated('Use gridMetaDescriptor instead') +const GridMeta$json = const { + '1': 'GridMeta', + '2': const [ + const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, + const {'1': 'fields', '3': 2, '4': 3, '5': 11, '6': '.FieldMeta', '10': 'fields'}, + const {'1': 'block_metas', '3': 3, '4': 3, '5': 11, '6': '.GridBlockMeta', '10': 'blockMetas'}, + ], +}; + +/// Descriptor for `GridMeta`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List gridMetaDescriptor = $convert.base64Decode('CghHcmlkTWV0YRIXCgdncmlkX2lkGAEgASgJUgZncmlkSWQSIgoGZmllbGRzGAIgAygLMgouRmllbGRNZXRhUgZmaWVsZHMSLwoLYmxvY2tfbWV0YXMYAyADKAsyDi5HcmlkQmxvY2tNZXRhUgpibG9ja01ldGFz'); +@$core.Deprecated('Use gridBlockMetaDescriptor instead') +const GridBlockMeta$json = const { + '1': 'GridBlockMeta', + '2': const [ + const {'1': 'block_id', '3': 1, '4': 1, '5': 9, '10': 'blockId'}, + const {'1': 'start_row_index', '3': 2, '4': 1, '5': 5, '10': 'startRowIndex'}, + const {'1': 'row_count', '3': 3, '4': 1, '5': 5, '10': 'rowCount'}, + ], +}; + +/// Descriptor for `GridBlockMeta`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List gridBlockMetaDescriptor = $convert.base64Decode('Cg1HcmlkQmxvY2tNZXRhEhkKCGJsb2NrX2lkGAEgASgJUgdibG9ja0lkEiYKD3N0YXJ0X3Jvd19pbmRleBgCIAEoBVINc3RhcnRSb3dJbmRleBIbCglyb3dfY291bnQYAyABKAVSCHJvd0NvdW50'); +@$core.Deprecated('Use gridBlockMetaSerdeDescriptor instead') +const GridBlockMetaSerde$json = const { + '1': 'GridBlockMetaSerde', + '2': const [ + const {'1': 'block_id', '3': 1, '4': 1, '5': 9, '10': 'blockId'}, + const {'1': 'row_metas', '3': 2, '4': 3, '5': 11, '6': '.RowMeta', '10': 'rowMetas'}, + ], +}; + +/// Descriptor for `GridBlockMetaSerde`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List gridBlockMetaSerdeDescriptor = $convert.base64Decode('ChJHcmlkQmxvY2tNZXRhU2VyZGUSGQoIYmxvY2tfaWQYASABKAlSB2Jsb2NrSWQSJQoJcm93X21ldGFzGAIgAygLMgguUm93TWV0YVIIcm93TWV0YXM='); +@$core.Deprecated('Use fieldMetaDescriptor instead') +const FieldMeta$json = const { + '1': 'FieldMeta', + '2': const [ + const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, + const {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'}, + const {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'}, + const {'1': 'field_type', '3': 4, '4': 1, '5': 14, '6': '.FieldType', '10': 'fieldType'}, + const {'1': 'frozen', '3': 5, '4': 1, '5': 8, '10': 'frozen'}, + const {'1': 'visibility', '3': 6, '4': 1, '5': 8, '10': 'visibility'}, + const {'1': 'width', '3': 7, '4': 1, '5': 5, '10': 'width'}, + const {'1': 'type_options', '3': 8, '4': 1, '5': 9, '10': 'typeOptions'}, + ], +}; + +/// Descriptor for `FieldMeta`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List fieldMetaDescriptor = $convert.base64Decode('CglGaWVsZE1ldGESDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSEgoEZGVzYxgDIAEoCVIEZGVzYxIpCgpmaWVsZF90eXBlGAQgASgOMgouRmllbGRUeXBlUglmaWVsZFR5cGUSFgoGZnJvemVuGAUgASgIUgZmcm96ZW4SHgoKdmlzaWJpbGl0eRgGIAEoCFIKdmlzaWJpbGl0eRIUCgV3aWR0aBgHIAEoBVIFd2lkdGgSIQoMdHlwZV9vcHRpb25zGAggASgJUgt0eXBlT3B0aW9ucw=='); +@$core.Deprecated('Use fieldChangesetDescriptor instead') +const FieldChangeset$json = const { + '1': 'FieldChangeset', + '2': const [ + const {'1': 'field_id', '3': 1, '4': 1, '5': 9, '10': 'fieldId'}, + const {'1': 'name', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'name'}, + const {'1': 'desc', '3': 3, '4': 1, '5': 9, '9': 1, '10': 'desc'}, + const {'1': 'field_type', '3': 4, '4': 1, '5': 14, '6': '.FieldType', '9': 2, '10': 'fieldType'}, + const {'1': 'frozen', '3': 5, '4': 1, '5': 8, '9': 3, '10': 'frozen'}, + const {'1': 'visibility', '3': 6, '4': 1, '5': 8, '9': 4, '10': 'visibility'}, + const {'1': 'width', '3': 7, '4': 1, '5': 5, '9': 5, '10': 'width'}, + const {'1': 'type_options', '3': 8, '4': 1, '5': 9, '9': 6, '10': 'typeOptions'}, + ], + '8': const [ + const {'1': 'one_of_name'}, + const {'1': 'one_of_desc'}, + const {'1': 'one_of_field_type'}, + const {'1': 'one_of_frozen'}, + const {'1': 'one_of_visibility'}, + const {'1': 'one_of_width'}, + const {'1': 'one_of_type_options'}, + ], +}; + +/// Descriptor for `FieldChangeset`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List fieldChangesetDescriptor = $convert.base64Decode('Cg5GaWVsZENoYW5nZXNldBIZCghmaWVsZF9pZBgBIAEoCVIHZmllbGRJZBIUCgRuYW1lGAIgASgJSABSBG5hbWUSFAoEZGVzYxgDIAEoCUgBUgRkZXNjEisKCmZpZWxkX3R5cGUYBCABKA4yCi5GaWVsZFR5cGVIAlIJZmllbGRUeXBlEhgKBmZyb3plbhgFIAEoCEgDUgZmcm96ZW4SIAoKdmlzaWJpbGl0eRgGIAEoCEgEUgp2aXNpYmlsaXR5EhYKBXdpZHRoGAcgASgFSAVSBXdpZHRoEiMKDHR5cGVfb3B0aW9ucxgIIAEoCUgGUgt0eXBlT3B0aW9uc0INCgtvbmVfb2ZfbmFtZUINCgtvbmVfb2ZfZGVzY0ITChFvbmVfb2ZfZmllbGRfdHlwZUIPCg1vbmVfb2ZfZnJvemVuQhMKEW9uZV9vZl92aXNpYmlsaXR5Qg4KDG9uZV9vZl93aWR0aEIVChNvbmVfb2ZfdHlwZV9vcHRpb25z'); +@$core.Deprecated('Use anyDataDescriptor instead') +const AnyData$json = const { + '1': 'AnyData', + '2': const [ + const {'1': 'type_id', '3': 1, '4': 1, '5': 9, '10': 'typeId'}, + const {'1': 'value', '3': 2, '4': 1, '5': 12, '10': 'value'}, + ], +}; + +/// Descriptor for `AnyData`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List anyDataDescriptor = $convert.base64Decode('CgdBbnlEYXRhEhcKB3R5cGVfaWQYASABKAlSBnR5cGVJZBIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU='); +@$core.Deprecated('Use rowMetaDescriptor instead') +const RowMeta$json = const { + '1': 'RowMeta', + '2': const [ + const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, + const {'1': 'block_id', '3': 2, '4': 1, '5': 9, '10': 'blockId'}, + const {'1': 'cell_by_field_id', '3': 3, '4': 3, '5': 11, '6': '.RowMeta.CellByFieldIdEntry', '10': 'cellByFieldId'}, + const {'1': 'height', '3': 4, '4': 1, '5': 5, '10': 'height'}, + const {'1': 'visibility', '3': 5, '4': 1, '5': 8, '10': 'visibility'}, + ], + '3': const [RowMeta_CellByFieldIdEntry$json], +}; + +@$core.Deprecated('Use rowMetaDescriptor instead') +const RowMeta_CellByFieldIdEntry$json = const { + '1': 'CellByFieldIdEntry', + '2': const [ + const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + const {'1': 'value', '3': 2, '4': 1, '5': 11, '6': '.CellMeta', '10': 'value'}, + ], + '7': const {'7': true}, +}; + +/// Descriptor for `RowMeta`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List rowMetaDescriptor = $convert.base64Decode('CgdSb3dNZXRhEg4KAmlkGAEgASgJUgJpZBIZCghibG9ja19pZBgCIAEoCVIHYmxvY2tJZBJEChBjZWxsX2J5X2ZpZWxkX2lkGAMgAygLMhsuUm93TWV0YS5DZWxsQnlGaWVsZElkRW50cnlSDWNlbGxCeUZpZWxkSWQSFgoGaGVpZ2h0GAQgASgFUgZoZWlnaHQSHgoKdmlzaWJpbGl0eRgFIAEoCFIKdmlzaWJpbGl0eRpLChJDZWxsQnlGaWVsZElkRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSHwoFdmFsdWUYAiABKAsyCS5DZWxsTWV0YVIFdmFsdWU6AjgB'); +@$core.Deprecated('Use rowMetaChangesetDescriptor instead') +const RowMetaChangeset$json = const { + '1': 'RowMetaChangeset', + '2': const [ + const {'1': 'row_id', '3': 1, '4': 1, '5': 9, '10': 'rowId'}, + const {'1': 'height', '3': 2, '4': 1, '5': 5, '9': 0, '10': 'height'}, + const {'1': 'visibility', '3': 3, '4': 1, '5': 8, '9': 1, '10': 'visibility'}, + const {'1': 'cell_by_field_id', '3': 4, '4': 3, '5': 11, '6': '.RowMetaChangeset.CellByFieldIdEntry', '10': 'cellByFieldId'}, + ], + '3': const [RowMetaChangeset_CellByFieldIdEntry$json], + '8': const [ + const {'1': 'one_of_height'}, + const {'1': 'one_of_visibility'}, + ], +}; + +@$core.Deprecated('Use rowMetaChangesetDescriptor instead') +const RowMetaChangeset_CellByFieldIdEntry$json = const { + '1': 'CellByFieldIdEntry', + '2': const [ + const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + const {'1': 'value', '3': 2, '4': 1, '5': 11, '6': '.CellMeta', '10': 'value'}, + ], + '7': const {'7': true}, +}; + +/// Descriptor for `RowMetaChangeset`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List rowMetaChangesetDescriptor = $convert.base64Decode('ChBSb3dNZXRhQ2hhbmdlc2V0EhUKBnJvd19pZBgBIAEoCVIFcm93SWQSGAoGaGVpZ2h0GAIgASgFSABSBmhlaWdodBIgCgp2aXNpYmlsaXR5GAMgASgISAFSCnZpc2liaWxpdHkSTQoQY2VsbF9ieV9maWVsZF9pZBgEIAMoCzIkLlJvd01ldGFDaGFuZ2VzZXQuQ2VsbEJ5RmllbGRJZEVudHJ5Ug1jZWxsQnlGaWVsZElkGksKEkNlbGxCeUZpZWxkSWRFbnRyeRIQCgNrZXkYASABKAlSA2tleRIfCgV2YWx1ZRgCIAEoCzIJLkNlbGxNZXRhUgV2YWx1ZToCOAFCDwoNb25lX29mX2hlaWdodEITChFvbmVfb2ZfdmlzaWJpbGl0eQ=='); +@$core.Deprecated('Use cellMetaDescriptor instead') +const CellMeta$json = const { + '1': 'CellMeta', + '2': const [ + const {'1': 'field_id', '3': 1, '4': 1, '5': 9, '10': 'fieldId'}, + const {'1': 'data', '3': 2, '4': 1, '5': 9, '10': 'data'}, + ], +}; + +/// Descriptor for `CellMeta`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List cellMetaDescriptor = $convert.base64Decode('CghDZWxsTWV0YRIZCghmaWVsZF9pZBgBIAEoCVIHZmllbGRJZBISCgRkYXRhGAIgASgJUgRkYXRh'); +@$core.Deprecated('Use cellMetaChangesetDescriptor instead') +const CellMetaChangeset$json = const { + '1': 'CellMetaChangeset', + '2': const [ + const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, + const {'1': 'row_id', '3': 2, '4': 1, '5': 9, '10': 'rowId'}, + const {'1': 'field_id', '3': 3, '4': 1, '5': 9, '10': 'fieldId'}, + const {'1': 'data', '3': 4, '4': 1, '5': 9, '9': 0, '10': 'data'}, + ], + '8': const [ + const {'1': 'one_of_data'}, + ], +}; + +/// Descriptor for `CellMetaChangeset`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List cellMetaChangesetDescriptor = $convert.base64Decode('ChFDZWxsTWV0YUNoYW5nZXNldBIXCgdncmlkX2lkGAEgASgJUgZncmlkSWQSFQoGcm93X2lkGAIgASgJUgVyb3dJZBIZCghmaWVsZF9pZBgDIAEoCVIHZmllbGRJZBIUCgRkYXRhGAQgASgJSABSBGRhdGFCDQoLb25lX29mX2RhdGE='); +@$core.Deprecated('Use buildGridContextDescriptor instead') +const BuildGridContext$json = const { + '1': 'BuildGridContext', + '2': const [ + const {'1': 'field_metas', '3': 1, '4': 3, '5': 11, '6': '.FieldMeta', '10': 'fieldMetas'}, + const {'1': 'block_metas', '3': 2, '4': 1, '5': 11, '6': '.GridBlockMeta', '10': 'blockMetas'}, + const {'1': 'block_meta_data', '3': 3, '4': 1, '5': 11, '6': '.GridBlockMetaSerde', '10': 'blockMetaData'}, + ], +}; + +/// Descriptor for `BuildGridContext`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List buildGridContextDescriptor = $convert.base64Decode('ChBCdWlsZEdyaWRDb250ZXh0EisKC2ZpZWxkX21ldGFzGAEgAygLMgouRmllbGRNZXRhUgpmaWVsZE1ldGFzEi8KC2Jsb2NrX21ldGFzGAIgASgLMg4uR3JpZEJsb2NrTWV0YVIKYmxvY2tNZXRhcxI7Cg9ibG9ja19tZXRhX2RhdGEYAyABKAsyEy5HcmlkQmxvY2tNZXRhU2VyZGVSDWJsb2NrTWV0YURhdGE='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbserver.dart new file mode 100644 index 0000000000..fdd12ef0bf --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: meta.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'meta.pb.dart'; + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/protobuf.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/protobuf.dart index 3f0100c8d6..2c253e0494 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/protobuf.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/protobuf.dart @@ -1,2 +1,3 @@ // Auto-generated, do not edit export './grid.pb.dart'; +export './meta.pb.dart'; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pb.dart new file mode 100644 index 0000000000..8481b81985 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pb.dart @@ -0,0 +1,58 @@ +/// +// Generated code. Do not modify. +// source: checkbox_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +class CheckboxDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CheckboxDescription', createEmptyInstance: create) + ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'isSelected') + ..hasRequiredFields = false + ; + + CheckboxDescription._() : super(); + factory CheckboxDescription({ + $core.bool? isSelected, + }) { + final _result = create(); + if (isSelected != null) { + _result.isSelected = isSelected; + } + return _result; + } + factory CheckboxDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CheckboxDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CheckboxDescription clone() => CheckboxDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CheckboxDescription copyWith(void Function(CheckboxDescription) updates) => super.copyWith((message) => updates(message as CheckboxDescription)) as CheckboxDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static CheckboxDescription create() => CheckboxDescription._(); + CheckboxDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CheckboxDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CheckboxDescription? _defaultInstance; + + @$pb.TagNumber(1) + $core.bool get isSelected => $_getBF(0); + @$pb.TagNumber(1) + set isSelected($core.bool v) { $_setBool(0, v); } + @$pb.TagNumber(1) + $core.bool hasIsSelected() => $_has(0); + @$pb.TagNumber(1) + void clearIsSelected() => clearField(1); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbenum.dart new file mode 100644 index 0000000000..0070b08607 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbenum.dart @@ -0,0 +1,7 @@ +/// +// Generated code. Do not modify. +// source: checkbox_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbjson.dart new file mode 100644 index 0000000000..6295b27033 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbjson.dart @@ -0,0 +1,20 @@ +/// +// Generated code. Do not modify. +// source: checkbox_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use checkboxDescriptionDescriptor instead') +const CheckboxDescription$json = const { + '1': 'CheckboxDescription', + '2': const [ + const {'1': 'is_selected', '3': 1, '4': 1, '5': 8, '10': 'isSelected'}, + ], +}; + +/// Descriptor for `CheckboxDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List checkboxDescriptionDescriptor = $convert.base64Decode('ChNDaGVja2JveERlc2NyaXB0aW9uEh8KC2lzX3NlbGVjdGVkGAEgASgIUgppc1NlbGVjdGVk'); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbserver.dart new file mode 100644 index 0000000000..166969b429 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: checkbox_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'checkbox_description.pb.dart'; + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pb.dart new file mode 100644 index 0000000000..402c0a4115 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pb.dart @@ -0,0 +1,11 @@ +/// +// Generated code. Do not modify. +// source: dart_notification.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +export 'dart_notification.pbenum.dart'; + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbenum.dart new file mode 100644 index 0000000000..f68b10f292 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbenum.dart @@ -0,0 +1,32 @@ +/// +// Generated code. Do not modify. +// source: dart_notification.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +// ignore_for_file: UNDEFINED_SHOWN_NAME +import 'dart:core' as $core; +import 'package:protobuf/protobuf.dart' as $pb; + +class GridNotification extends $pb.ProtobufEnum { + static const GridNotification Unknown = GridNotification._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Unknown'); + static const GridNotification GridDidUpdateBlock = GridNotification._(10, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GridDidUpdateBlock'); + static const GridNotification GridDidCreateBlock = GridNotification._(11, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GridDidCreateBlock'); + static const GridNotification GridDidUpdateCells = GridNotification._(20, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GridDidUpdateCells'); + static const GridNotification GridDidUpdateFields = GridNotification._(30, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GridDidUpdateFields'); + + static const $core.List values = [ + Unknown, + GridDidUpdateBlock, + GridDidCreateBlock, + GridDidUpdateCells, + GridDidUpdateFields, + ]; + + static final $core.Map<$core.int, GridNotification> _byValue = $pb.ProtobufEnum.initByValue(values); + static GridNotification? valueOf($core.int value) => _byValue[value]; + + const GridNotification._($core.int v, $core.String n) : super(v, n); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbjson.dart new file mode 100644 index 0000000000..b266e63e09 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbjson.dart @@ -0,0 +1,24 @@ +/// +// Generated code. Do not modify. +// source: dart_notification.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use gridNotificationDescriptor instead') +const GridNotification$json = const { + '1': 'GridNotification', + '2': const [ + const {'1': 'Unknown', '2': 0}, + const {'1': 'GridDidUpdateBlock', '2': 10}, + const {'1': 'GridDidCreateBlock', '2': 11}, + const {'1': 'GridDidUpdateCells', '2': 20}, + const {'1': 'GridDidUpdateFields', '2': 30}, + ], +}; + +/// Descriptor for `GridNotification`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List gridNotificationDescriptor = $convert.base64Decode('ChBHcmlkTm90aWZpY2F0aW9uEgsKB1Vua25vd24QABIWChJHcmlkRGlkVXBkYXRlQmxvY2sQChIWChJHcmlkRGlkQ3JlYXRlQmxvY2sQCxIWChJHcmlkRGlkVXBkYXRlQ2VsbHMQFBIXChNHcmlkRGlkVXBkYXRlRmllbGRzEB4='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbserver.dart new file mode 100644 index 0000000000..8be819e83e --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: dart_notification.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'dart_notification.pb.dart'; + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pb.dart new file mode 100644 index 0000000000..a70bff6f3c --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pb.dart @@ -0,0 +1,76 @@ +/// +// Generated code. Do not modify. +// source: date_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +import 'date_description.pbenum.dart'; + +export 'date_description.pbenum.dart'; + +class DateDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DateDescription', createEmptyInstance: create) + ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dateFormat', $pb.PbFieldType.OE, defaultOrMaker: DateFormat.Local, valueOf: DateFormat.valueOf, enumValues: DateFormat.values) + ..e(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'timeFormat', $pb.PbFieldType.OE, defaultOrMaker: TimeFormat.TwelveHour, valueOf: TimeFormat.valueOf, enumValues: TimeFormat.values) + ..hasRequiredFields = false + ; + + DateDescription._() : super(); + factory DateDescription({ + DateFormat? dateFormat, + TimeFormat? timeFormat, + }) { + final _result = create(); + if (dateFormat != null) { + _result.dateFormat = dateFormat; + } + if (timeFormat != null) { + _result.timeFormat = timeFormat; + } + return _result; + } + factory DateDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory DateDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + DateDescription clone() => DateDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + DateDescription copyWith(void Function(DateDescription) updates) => super.copyWith((message) => updates(message as DateDescription)) as DateDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static DateDescription create() => DateDescription._(); + DateDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static DateDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static DateDescription? _defaultInstance; + + @$pb.TagNumber(1) + DateFormat get dateFormat => $_getN(0); + @$pb.TagNumber(1) + set dateFormat(DateFormat v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasDateFormat() => $_has(0); + @$pb.TagNumber(1) + void clearDateFormat() => clearField(1); + + @$pb.TagNumber(2) + TimeFormat get timeFormat => $_getN(1); + @$pb.TagNumber(2) + set timeFormat(TimeFormat v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasTimeFormat() => $_has(1); + @$pb.TagNumber(2) + void clearTimeFormat() => clearField(2); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbenum.dart new file mode 100644 index 0000000000..93ea01d9be --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbenum.dart @@ -0,0 +1,45 @@ +/// +// Generated code. Do not modify. +// source: date_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +// ignore_for_file: UNDEFINED_SHOWN_NAME +import 'dart:core' as $core; +import 'package:protobuf/protobuf.dart' as $pb; + +class DateFormat extends $pb.ProtobufEnum { + static const DateFormat Local = DateFormat._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Local'); + static const DateFormat US = DateFormat._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'US'); + static const DateFormat ISO = DateFormat._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ISO'); + static const DateFormat Friendly = DateFormat._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Friendly'); + + static const $core.List values = [ + Local, + US, + ISO, + Friendly, + ]; + + static final $core.Map<$core.int, DateFormat> _byValue = $pb.ProtobufEnum.initByValue(values); + static DateFormat? valueOf($core.int value) => _byValue[value]; + + const DateFormat._($core.int v, $core.String n) : super(v, n); +} + +class TimeFormat extends $pb.ProtobufEnum { + static const TimeFormat TwelveHour = TimeFormat._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TwelveHour'); + static const TimeFormat TwentyFourHour = TimeFormat._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TwentyFourHour'); + + static const $core.List values = [ + TwelveHour, + TwentyFourHour, + ]; + + static final $core.Map<$core.int, TimeFormat> _byValue = $pb.ProtobufEnum.initByValue(values); + static TimeFormat? valueOf($core.int value) => _byValue[value]; + + const TimeFormat._($core.int v, $core.String n) : super(v, n); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbjson.dart new file mode 100644 index 0000000000..841db39005 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbjson.dart @@ -0,0 +1,45 @@ +/// +// Generated code. Do not modify. +// source: date_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use dateFormatDescriptor instead') +const DateFormat$json = const { + '1': 'DateFormat', + '2': const [ + const {'1': 'Local', '2': 0}, + const {'1': 'US', '2': 1}, + const {'1': 'ISO', '2': 2}, + const {'1': 'Friendly', '2': 3}, + ], +}; + +/// Descriptor for `DateFormat`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List dateFormatDescriptor = $convert.base64Decode('CgpEYXRlRm9ybWF0EgkKBUxvY2FsEAASBgoCVVMQARIHCgNJU08QAhIMCghGcmllbmRseRAD'); +@$core.Deprecated('Use timeFormatDescriptor instead') +const TimeFormat$json = const { + '1': 'TimeFormat', + '2': const [ + const {'1': 'TwelveHour', '2': 0}, + const {'1': 'TwentyFourHour', '2': 1}, + ], +}; + +/// Descriptor for `TimeFormat`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List timeFormatDescriptor = $convert.base64Decode('CgpUaW1lRm9ybWF0Eg4KClR3ZWx2ZUhvdXIQABISCg5Ud2VudHlGb3VySG91chAB'); +@$core.Deprecated('Use dateDescriptionDescriptor instead') +const DateDescription$json = const { + '1': 'DateDescription', + '2': const [ + const {'1': 'date_format', '3': 1, '4': 1, '5': 14, '6': '.DateFormat', '10': 'dateFormat'}, + const {'1': 'time_format', '3': 2, '4': 1, '5': 14, '6': '.TimeFormat', '10': 'timeFormat'}, + ], +}; + +/// Descriptor for `DateDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List dateDescriptionDescriptor = $convert.base64Decode('Cg9EYXRlRGVzY3JpcHRpb24SLAoLZGF0ZV9mb3JtYXQYASABKA4yCy5EYXRlRm9ybWF0UgpkYXRlRm9ybWF0EiwKC3RpbWVfZm9ybWF0GAIgASgOMgsuVGltZUZvcm1hdFIKdGltZUZvcm1hdA=='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbserver.dart new file mode 100644 index 0000000000..dd4ff2c3c7 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: date_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'date_description.pb.dart'; + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbenum.dart index 29a15a76b3..91a3861076 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbenum.dart @@ -11,15 +11,19 @@ import 'package:protobuf/protobuf.dart' as $pb; class GridEvent extends $pb.ProtobufEnum { static const GridEvent GetGridData = GridEvent._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetGridData'); - static const GridEvent GetRows = GridEvent._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetRows'); - static const GridEvent GetFields = GridEvent._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetFields'); - static const GridEvent CreateRow = GridEvent._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CreateRow'); + static const GridEvent GetGridBlocks = GridEvent._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetGridBlocks'); + static const GridEvent GetFields = GridEvent._(10, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetFields'); + static const GridEvent CreateRow = GridEvent._(11, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CreateRow'); + static const GridEvent GetRow = GridEvent._(12, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetRow'); + static const GridEvent UpdateCell = GridEvent._(20, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UpdateCell'); static const $core.List values = [ GetGridData, - GetRows, + GetGridBlocks, GetFields, CreateRow, + GetRow, + UpdateCell, ]; static final $core.Map<$core.int, GridEvent> _byValue = $pb.ProtobufEnum.initByValue(values); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbjson.dart index 0791be4e50..c203b10c75 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbjson.dart @@ -13,11 +13,13 @@ const GridEvent$json = const { '1': 'GridEvent', '2': const [ const {'1': 'GetGridData', '2': 0}, - const {'1': 'GetRows', '2': 1}, - const {'1': 'GetFields', '2': 2}, - const {'1': 'CreateRow', '2': 3}, + const {'1': 'GetGridBlocks', '2': 1}, + const {'1': 'GetFields', '2': 10}, + const {'1': 'CreateRow', '2': 11}, + const {'1': 'GetRow', '2': 12}, + const {'1': 'UpdateCell', '2': 20}, ], }; /// Descriptor for `GridEvent`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List gridEventDescriptor = $convert.base64Decode('CglHcmlkRXZlbnQSDwoLR2V0R3JpZERhdGEQABILCgdHZXRSb3dzEAESDQoJR2V0RmllbGRzEAISDQoJQ3JlYXRlUm93EAM='); +final $typed_data.Uint8List gridEventDescriptor = $convert.base64Decode('CglHcmlkRXZlbnQSDwoLR2V0R3JpZERhdGEQABIRCg1HZXRHcmlkQmxvY2tzEAESDQoJR2V0RmllbGRzEAoSDQoJQ3JlYXRlUm93EAsSCgoGR2V0Um93EAwSDgoKVXBkYXRlQ2VsbBAU'); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pb.dart new file mode 100644 index 0000000000..19064fbfd1 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pb.dart @@ -0,0 +1,118 @@ +/// +// Generated code. Do not modify. +// source: number_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +import 'number_description.pbenum.dart'; + +export 'number_description.pbenum.dart'; + +class NumberDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NumberDescription', createEmptyInstance: create) + ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'format', $pb.PbFieldType.OE, defaultOrMaker: NumberFormat.Number, valueOf: NumberFormat.valueOf, enumValues: NumberFormat.values) + ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'scale', $pb.PbFieldType.OU3) + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'symbol') + ..aOB(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'signPositive') + ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') + ..hasRequiredFields = false + ; + + NumberDescription._() : super(); + factory NumberDescription({ + NumberFormat? format, + $core.int? scale, + $core.String? symbol, + $core.bool? signPositive, + $core.String? name, + }) { + final _result = create(); + if (format != null) { + _result.format = format; + } + if (scale != null) { + _result.scale = scale; + } + if (symbol != null) { + _result.symbol = symbol; + } + if (signPositive != null) { + _result.signPositive = signPositive; + } + if (name != null) { + _result.name = name; + } + return _result; + } + factory NumberDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory NumberDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + NumberDescription clone() => NumberDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + NumberDescription copyWith(void Function(NumberDescription) updates) => super.copyWith((message) => updates(message as NumberDescription)) as NumberDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static NumberDescription create() => NumberDescription._(); + NumberDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static NumberDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static NumberDescription? _defaultInstance; + + @$pb.TagNumber(1) + NumberFormat get format => $_getN(0); + @$pb.TagNumber(1) + set format(NumberFormat v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasFormat() => $_has(0); + @$pb.TagNumber(1) + void clearFormat() => clearField(1); + + @$pb.TagNumber(2) + $core.int get scale => $_getIZ(1); + @$pb.TagNumber(2) + set scale($core.int v) { $_setUnsignedInt32(1, v); } + @$pb.TagNumber(2) + $core.bool hasScale() => $_has(1); + @$pb.TagNumber(2) + void clearScale() => clearField(2); + + @$pb.TagNumber(3) + $core.String get symbol => $_getSZ(2); + @$pb.TagNumber(3) + set symbol($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasSymbol() => $_has(2); + @$pb.TagNumber(3) + void clearSymbol() => clearField(3); + + @$pb.TagNumber(4) + $core.bool get signPositive => $_getBF(3); + @$pb.TagNumber(4) + set signPositive($core.bool v) { $_setBool(3, v); } + @$pb.TagNumber(4) + $core.bool hasSignPositive() => $_has(3); + @$pb.TagNumber(4) + void clearSignPositive() => clearField(4); + + @$pb.TagNumber(5) + $core.String get name => $_getSZ(4); + @$pb.TagNumber(5) + set name($core.String v) { $_setString(4, v); } + @$pb.TagNumber(5) + $core.bool hasName() => $_has(4); + @$pb.TagNumber(5) + void clearName() => clearField(5); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbenum.dart new file mode 100644 index 0000000000..f5c3d38628 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbenum.dart @@ -0,0 +1,30 @@ +/// +// Generated code. Do not modify. +// source: number_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +// ignore_for_file: UNDEFINED_SHOWN_NAME +import 'dart:core' as $core; +import 'package:protobuf/protobuf.dart' as $pb; + +class NumberFormat extends $pb.ProtobufEnum { + static const NumberFormat Number = NumberFormat._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Number'); + static const NumberFormat USD = NumberFormat._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'USD'); + static const NumberFormat CNY = NumberFormat._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CNY'); + static const NumberFormat EUR = NumberFormat._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EUR'); + + static const $core.List values = [ + Number, + USD, + CNY, + EUR, + ]; + + static final $core.Map<$core.int, NumberFormat> _byValue = $pb.ProtobufEnum.initByValue(values); + static NumberFormat? valueOf($core.int value) => _byValue[value]; + + const NumberFormat._($core.int v, $core.String n) : super(v, n); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbjson.dart new file mode 100644 index 0000000000..ff1b3dc40f --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbjson.dart @@ -0,0 +1,37 @@ +/// +// Generated code. Do not modify. +// source: number_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use numberFormatDescriptor instead') +const NumberFormat$json = const { + '1': 'NumberFormat', + '2': const [ + const {'1': 'Number', '2': 0}, + const {'1': 'USD', '2': 1}, + const {'1': 'CNY', '2': 2}, + const {'1': 'EUR', '2': 3}, + ], +}; + +/// Descriptor for `NumberFormat`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List numberFormatDescriptor = $convert.base64Decode('CgxOdW1iZXJGb3JtYXQSCgoGTnVtYmVyEAASBwoDVVNEEAESBwoDQ05ZEAISBwoDRVVSEAM='); +@$core.Deprecated('Use numberDescriptionDescriptor instead') +const NumberDescription$json = const { + '1': 'NumberDescription', + '2': const [ + const {'1': 'format', '3': 1, '4': 1, '5': 14, '6': '.NumberFormat', '10': 'format'}, + const {'1': 'scale', '3': 2, '4': 1, '5': 13, '10': 'scale'}, + const {'1': 'symbol', '3': 3, '4': 1, '5': 9, '10': 'symbol'}, + const {'1': 'sign_positive', '3': 4, '4': 1, '5': 8, '10': 'signPositive'}, + const {'1': 'name', '3': 5, '4': 1, '5': 9, '10': 'name'}, + ], +}; + +/// Descriptor for `NumberDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List numberDescriptionDescriptor = $convert.base64Decode('ChFOdW1iZXJEZXNjcmlwdGlvbhIlCgZmb3JtYXQYASABKA4yDS5OdW1iZXJGb3JtYXRSBmZvcm1hdBIUCgVzY2FsZRgCIAEoDVIFc2NhbGUSFgoGc3ltYm9sGAMgASgJUgZzeW1ib2wSIwoNc2lnbl9wb3NpdGl2ZRgEIAEoCFIMc2lnblBvc2l0aXZlEhIKBG5hbWUYBSABKAlSBG5hbWU='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbserver.dart new file mode 100644 index 0000000000..58225a92b7 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: number_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'number_description.pb.dart'; + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/protobuf.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/protobuf.dart index 39a722893a..daefe6a170 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/protobuf.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/protobuf.dart @@ -1,3 +1,8 @@ // Auto-generated, do not edit -export './cell_data.pb.dart'; +export './date_description.pb.dart'; +export './text_description.pb.dart'; +export './dart_notification.pb.dart'; +export './checkbox_description.pb.dart'; +export './selection_description.pb.dart'; export './event_map.pb.dart'; +export './number_description.pb.dart'; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pb.dart new file mode 100644 index 0000000000..27b2fa8431 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pb.dart @@ -0,0 +1,196 @@ +/// +// Generated code. Do not modify. +// source: selection_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +class SingleSelectDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SingleSelectDescription', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) + ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') + ..hasRequiredFields = false + ; + + SingleSelectDescription._() : super(); + factory SingleSelectDescription({ + $core.Iterable? options, + $core.bool? disableColor, + }) { + final _result = create(); + if (options != null) { + _result.options.addAll(options); + } + if (disableColor != null) { + _result.disableColor = disableColor; + } + return _result; + } + factory SingleSelectDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SingleSelectDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + SingleSelectDescription clone() => SingleSelectDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SingleSelectDescription copyWith(void Function(SingleSelectDescription) updates) => super.copyWith((message) => updates(message as SingleSelectDescription)) as SingleSelectDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static SingleSelectDescription create() => SingleSelectDescription._(); + SingleSelectDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SingleSelectDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SingleSelectDescription? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get options => $_getList(0); + + @$pb.TagNumber(2) + $core.bool get disableColor => $_getBF(1); + @$pb.TagNumber(2) + set disableColor($core.bool v) { $_setBool(1, v); } + @$pb.TagNumber(2) + $core.bool hasDisableColor() => $_has(1); + @$pb.TagNumber(2) + void clearDisableColor() => clearField(2); +} + +class MultiSelectDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MultiSelectDescription', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) + ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') + ..hasRequiredFields = false + ; + + MultiSelectDescription._() : super(); + factory MultiSelectDescription({ + $core.Iterable? options, + $core.bool? disableColor, + }) { + final _result = create(); + if (options != null) { + _result.options.addAll(options); + } + if (disableColor != null) { + _result.disableColor = disableColor; + } + return _result; + } + factory MultiSelectDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory MultiSelectDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + MultiSelectDescription clone() => MultiSelectDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + MultiSelectDescription copyWith(void Function(MultiSelectDescription) updates) => super.copyWith((message) => updates(message as MultiSelectDescription)) as MultiSelectDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static MultiSelectDescription create() => MultiSelectDescription._(); + MultiSelectDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static MultiSelectDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static MultiSelectDescription? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get options => $_getList(0); + + @$pb.TagNumber(2) + $core.bool get disableColor => $_getBF(1); + @$pb.TagNumber(2) + set disableColor($core.bool v) { $_setBool(1, v); } + @$pb.TagNumber(2) + $core.bool hasDisableColor() => $_has(1); + @$pb.TagNumber(2) + void clearDisableColor() => clearField(2); +} + +class SelectOption extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SelectOption', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'color') + ..hasRequiredFields = false + ; + + SelectOption._() : super(); + factory SelectOption({ + $core.String? id, + $core.String? name, + $core.String? color, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (name != null) { + _result.name = name; + } + if (color != null) { + _result.color = color; + } + return _result; + } + factory SelectOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SelectOption.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + SelectOption clone() => SelectOption()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SelectOption copyWith(void Function(SelectOption) updates) => super.copyWith((message) => updates(message as SelectOption)) as SelectOption; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static SelectOption create() => SelectOption._(); + SelectOption createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SelectOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SelectOption? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get name => $_getSZ(1); + @$pb.TagNumber(2) + set name($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasName() => $_has(1); + @$pb.TagNumber(2) + void clearName() => clearField(2); + + @$pb.TagNumber(3) + $core.String get color => $_getSZ(2); + @$pb.TagNumber(3) + set color($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasColor() => $_has(2); + @$pb.TagNumber(3) + void clearColor() => clearField(3); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbenum.dart new file mode 100644 index 0000000000..6688bc34c9 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbenum.dart @@ -0,0 +1,7 @@ +/// +// Generated code. Do not modify. +// source: selection_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbjson.dart new file mode 100644 index 0000000000..6bb0c9e4db --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbjson.dart @@ -0,0 +1,44 @@ +/// +// Generated code. Do not modify. +// source: selection_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use singleSelectDescriptionDescriptor instead') +const SingleSelectDescription$json = const { + '1': 'SingleSelectDescription', + '2': const [ + const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, + const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, + ], +}; + +/// Descriptor for `SingleSelectDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List singleSelectDescriptionDescriptor = $convert.base64Decode('ChdTaW5nbGVTZWxlY3REZXNjcmlwdGlvbhInCgdvcHRpb25zGAEgAygLMg0uU2VsZWN0T3B0aW9uUgdvcHRpb25zEiMKDWRpc2FibGVfY29sb3IYAiABKAhSDGRpc2FibGVDb2xvcg=='); +@$core.Deprecated('Use multiSelectDescriptionDescriptor instead') +const MultiSelectDescription$json = const { + '1': 'MultiSelectDescription', + '2': const [ + const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, + const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, + ], +}; + +/// Descriptor for `MultiSelectDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List multiSelectDescriptionDescriptor = $convert.base64Decode('ChZNdWx0aVNlbGVjdERlc2NyaXB0aW9uEicKB29wdGlvbnMYASADKAsyDS5TZWxlY3RPcHRpb25SB29wdGlvbnMSIwoNZGlzYWJsZV9jb2xvchgCIAEoCFIMZGlzYWJsZUNvbG9y'); +@$core.Deprecated('Use selectOptionDescriptor instead') +const SelectOption$json = const { + '1': 'SelectOption', + '2': const [ + const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, + const {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'}, + const {'1': 'color', '3': 3, '4': 1, '5': 9, '10': 'color'}, + ], +}; + +/// Descriptor for `SelectOption`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List selectOptionDescriptor = $convert.base64Decode('CgxTZWxlY3RPcHRpb24SDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSFAoFY29sb3IYAyABKAlSBWNvbG9y'); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbserver.dart new file mode 100644 index 0000000000..f55cbba1ec --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: selection_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'selection_description.pb.dart'; + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pb.dart new file mode 100644 index 0000000000..9434b2fc90 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pb.dart @@ -0,0 +1,58 @@ +/// +// Generated code. Do not modify. +// source: text_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +class RichTextDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RichTextDescription', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'format') + ..hasRequiredFields = false + ; + + RichTextDescription._() : super(); + factory RichTextDescription({ + $core.String? format, + }) { + final _result = create(); + if (format != null) { + _result.format = format; + } + return _result; + } + factory RichTextDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RichTextDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + RichTextDescription clone() => RichTextDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RichTextDescription copyWith(void Function(RichTextDescription) updates) => super.copyWith((message) => updates(message as RichTextDescription)) as RichTextDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static RichTextDescription create() => RichTextDescription._(); + RichTextDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RichTextDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RichTextDescription? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get format => $_getSZ(0); + @$pb.TagNumber(1) + set format($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasFormat() => $_has(0); + @$pb.TagNumber(1) + void clearFormat() => clearField(1); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbenum.dart new file mode 100644 index 0000000000..e01054c586 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbenum.dart @@ -0,0 +1,7 @@ +/// +// Generated code. Do not modify. +// source: text_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbjson.dart new file mode 100644 index 0000000000..fdf2098d47 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbjson.dart @@ -0,0 +1,20 @@ +/// +// Generated code. Do not modify. +// source: text_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use richTextDescriptionDescriptor instead') +const RichTextDescription$json = const { + '1': 'RichTextDescription', + '2': const [ + const {'1': 'format', '3': 1, '4': 1, '5': 9, '10': 'format'}, + ], +}; + +/// Descriptor for `RichTextDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List richTextDescriptionDescriptor = $convert.base64Decode('ChNSaWNoVGV4dERlc2NyaXB0aW9uEhYKBmZvcm1hdBgBIAEoCVIGZm9ybWF0'); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbserver.dart new file mode 100644 index 0000000000..2a02dd56b1 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: text_description.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'text_description.pb.dart'; + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pb.dart new file mode 100644 index 0000000000..152eef0c74 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pb.dart @@ -0,0 +1,458 @@ +/// +// Generated code. Do not modify. +// source: type_options.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +import 'type_options.pbenum.dart'; + +export 'type_options.pbenum.dart'; + +class RichTextDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RichTextDescription', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'format') + ..hasRequiredFields = false + ; + + RichTextDescription._() : super(); + factory RichTextDescription({ + $core.String? format, + }) { + final _result = create(); + if (format != null) { + _result.format = format; + } + return _result; + } + factory RichTextDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RichTextDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + RichTextDescription clone() => RichTextDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RichTextDescription copyWith(void Function(RichTextDescription) updates) => super.copyWith((message) => updates(message as RichTextDescription)) as RichTextDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static RichTextDescription create() => RichTextDescription._(); + RichTextDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RichTextDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RichTextDescription? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get format => $_getSZ(0); + @$pb.TagNumber(1) + set format($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasFormat() => $_has(0); + @$pb.TagNumber(1) + void clearFormat() => clearField(1); +} + +class CheckboxDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CheckboxDescription', createEmptyInstance: create) + ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'isSelected') + ..hasRequiredFields = false + ; + + CheckboxDescription._() : super(); + factory CheckboxDescription({ + $core.bool? isSelected, + }) { + final _result = create(); + if (isSelected != null) { + _result.isSelected = isSelected; + } + return _result; + } + factory CheckboxDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CheckboxDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CheckboxDescription clone() => CheckboxDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CheckboxDescription copyWith(void Function(CheckboxDescription) updates) => super.copyWith((message) => updates(message as CheckboxDescription)) as CheckboxDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static CheckboxDescription create() => CheckboxDescription._(); + CheckboxDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CheckboxDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CheckboxDescription? _defaultInstance; + + @$pb.TagNumber(1) + $core.bool get isSelected => $_getBF(0); + @$pb.TagNumber(1) + set isSelected($core.bool v) { $_setBool(0, v); } + @$pb.TagNumber(1) + $core.bool hasIsSelected() => $_has(0); + @$pb.TagNumber(1) + void clearIsSelected() => clearField(1); +} + +class DateDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DateDescription', createEmptyInstance: create) + ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dateFormat', $pb.PbFieldType.OE, defaultOrMaker: DateFormat.Local, valueOf: DateFormat.valueOf, enumValues: DateFormat.values) + ..e(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'timeFormat', $pb.PbFieldType.OE, defaultOrMaker: TimeFormat.TwelveHour, valueOf: TimeFormat.valueOf, enumValues: TimeFormat.values) + ..hasRequiredFields = false + ; + + DateDescription._() : super(); + factory DateDescription({ + DateFormat? dateFormat, + TimeFormat? timeFormat, + }) { + final _result = create(); + if (dateFormat != null) { + _result.dateFormat = dateFormat; + } + if (timeFormat != null) { + _result.timeFormat = timeFormat; + } + return _result; + } + factory DateDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory DateDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + DateDescription clone() => DateDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + DateDescription copyWith(void Function(DateDescription) updates) => super.copyWith((message) => updates(message as DateDescription)) as DateDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static DateDescription create() => DateDescription._(); + DateDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static DateDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static DateDescription? _defaultInstance; + + @$pb.TagNumber(1) + DateFormat get dateFormat => $_getN(0); + @$pb.TagNumber(1) + set dateFormat(DateFormat v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasDateFormat() => $_has(0); + @$pb.TagNumber(1) + void clearDateFormat() => clearField(1); + + @$pb.TagNumber(2) + TimeFormat get timeFormat => $_getN(1); + @$pb.TagNumber(2) + set timeFormat(TimeFormat v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasTimeFormat() => $_has(1); + @$pb.TagNumber(2) + void clearTimeFormat() => clearField(2); +} + +class SingleSelectDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SingleSelectDescription', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) + ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') + ..hasRequiredFields = false + ; + + SingleSelectDescription._() : super(); + factory SingleSelectDescription({ + $core.Iterable? options, + $core.bool? disableColor, + }) { + final _result = create(); + if (options != null) { + _result.options.addAll(options); + } + if (disableColor != null) { + _result.disableColor = disableColor; + } + return _result; + } + factory SingleSelectDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SingleSelectDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + SingleSelectDescription clone() => SingleSelectDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SingleSelectDescription copyWith(void Function(SingleSelectDescription) updates) => super.copyWith((message) => updates(message as SingleSelectDescription)) as SingleSelectDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static SingleSelectDescription create() => SingleSelectDescription._(); + SingleSelectDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SingleSelectDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SingleSelectDescription? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get options => $_getList(0); + + @$pb.TagNumber(2) + $core.bool get disableColor => $_getBF(1); + @$pb.TagNumber(2) + set disableColor($core.bool v) { $_setBool(1, v); } + @$pb.TagNumber(2) + $core.bool hasDisableColor() => $_has(1); + @$pb.TagNumber(2) + void clearDisableColor() => clearField(2); +} + +class MultiSelectDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MultiSelectDescription', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) + ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') + ..hasRequiredFields = false + ; + + MultiSelectDescription._() : super(); + factory MultiSelectDescription({ + $core.Iterable? options, + $core.bool? disableColor, + }) { + final _result = create(); + if (options != null) { + _result.options.addAll(options); + } + if (disableColor != null) { + _result.disableColor = disableColor; + } + return _result; + } + factory MultiSelectDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory MultiSelectDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + MultiSelectDescription clone() => MultiSelectDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + MultiSelectDescription copyWith(void Function(MultiSelectDescription) updates) => super.copyWith((message) => updates(message as MultiSelectDescription)) as MultiSelectDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static MultiSelectDescription create() => MultiSelectDescription._(); + MultiSelectDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static MultiSelectDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static MultiSelectDescription? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get options => $_getList(0); + + @$pb.TagNumber(2) + $core.bool get disableColor => $_getBF(1); + @$pb.TagNumber(2) + set disableColor($core.bool v) { $_setBool(1, v); } + @$pb.TagNumber(2) + $core.bool hasDisableColor() => $_has(1); + @$pb.TagNumber(2) + void clearDisableColor() => clearField(2); +} + +class SelectOption extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SelectOption', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'color') + ..hasRequiredFields = false + ; + + SelectOption._() : super(); + factory SelectOption({ + $core.String? id, + $core.String? name, + $core.String? color, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (name != null) { + _result.name = name; + } + if (color != null) { + _result.color = color; + } + return _result; + } + factory SelectOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SelectOption.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + SelectOption clone() => SelectOption()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SelectOption copyWith(void Function(SelectOption) updates) => super.copyWith((message) => updates(message as SelectOption)) as SelectOption; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static SelectOption create() => SelectOption._(); + SelectOption createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SelectOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SelectOption? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get name => $_getSZ(1); + @$pb.TagNumber(2) + set name($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasName() => $_has(1); + @$pb.TagNumber(2) + void clearName() => clearField(2); + + @$pb.TagNumber(3) + $core.String get color => $_getSZ(2); + @$pb.TagNumber(3) + set color($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasColor() => $_has(2); + @$pb.TagNumber(3) + void clearColor() => clearField(3); +} + +class NumberDescription extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NumberDescription', createEmptyInstance: create) + ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'money', $pb.PbFieldType.OE, defaultOrMaker: MoneySymbol.CNY, valueOf: MoneySymbol.valueOf, enumValues: MoneySymbol.values) + ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'scale', $pb.PbFieldType.OU3) + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'symbol') + ..aOB(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'signPositive') + ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') + ..hasRequiredFields = false + ; + + NumberDescription._() : super(); + factory NumberDescription({ + MoneySymbol? money, + $core.int? scale, + $core.String? symbol, + $core.bool? signPositive, + $core.String? name, + }) { + final _result = create(); + if (money != null) { + _result.money = money; + } + if (scale != null) { + _result.scale = scale; + } + if (symbol != null) { + _result.symbol = symbol; + } + if (signPositive != null) { + _result.signPositive = signPositive; + } + if (name != null) { + _result.name = name; + } + return _result; + } + factory NumberDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory NumberDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + NumberDescription clone() => NumberDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + NumberDescription copyWith(void Function(NumberDescription) updates) => super.copyWith((message) => updates(message as NumberDescription)) as NumberDescription; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static NumberDescription create() => NumberDescription._(); + NumberDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static NumberDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static NumberDescription? _defaultInstance; + + @$pb.TagNumber(1) + MoneySymbol get money => $_getN(0); + @$pb.TagNumber(1) + set money(MoneySymbol v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasMoney() => $_has(0); + @$pb.TagNumber(1) + void clearMoney() => clearField(1); + + @$pb.TagNumber(2) + $core.int get scale => $_getIZ(1); + @$pb.TagNumber(2) + set scale($core.int v) { $_setUnsignedInt32(1, v); } + @$pb.TagNumber(2) + $core.bool hasScale() => $_has(1); + @$pb.TagNumber(2) + void clearScale() => clearField(2); + + @$pb.TagNumber(3) + $core.String get symbol => $_getSZ(2); + @$pb.TagNumber(3) + set symbol($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasSymbol() => $_has(2); + @$pb.TagNumber(3) + void clearSymbol() => clearField(3); + + @$pb.TagNumber(4) + $core.bool get signPositive => $_getBF(3); + @$pb.TagNumber(4) + set signPositive($core.bool v) { $_setBool(3, v); } + @$pb.TagNumber(4) + $core.bool hasSignPositive() => $_has(3); + @$pb.TagNumber(4) + void clearSignPositive() => clearField(4); + + @$pb.TagNumber(5) + $core.String get name => $_getSZ(4); + @$pb.TagNumber(5) + set name($core.String v) { $_setString(4, v); } + @$pb.TagNumber(5) + $core.bool hasName() => $_has(4); + @$pb.TagNumber(5) + void clearName() => clearField(5); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbenum.dart new file mode 100644 index 0000000000..c3815cf5e1 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbenum.dart @@ -0,0 +1,62 @@ +/// +// Generated code. Do not modify. +// source: type_options.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +// ignore_for_file: UNDEFINED_SHOWN_NAME +import 'dart:core' as $core; +import 'package:protobuf/protobuf.dart' as $pb; + +class DateFormat extends $pb.ProtobufEnum { + static const DateFormat Local = DateFormat._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Local'); + static const DateFormat US = DateFormat._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'US'); + static const DateFormat ISO = DateFormat._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ISO'); + static const DateFormat Friendly = DateFormat._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Friendly'); + + static const $core.List values = [ + Local, + US, + ISO, + Friendly, + ]; + + static final $core.Map<$core.int, DateFormat> _byValue = $pb.ProtobufEnum.initByValue(values); + static DateFormat? valueOf($core.int value) => _byValue[value]; + + const DateFormat._($core.int v, $core.String n) : super(v, n); +} + +class TimeFormat extends $pb.ProtobufEnum { + static const TimeFormat TwelveHour = TimeFormat._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TwelveHour'); + static const TimeFormat TwentyFourHour = TimeFormat._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TwentyFourHour'); + + static const $core.List values = [ + TwelveHour, + TwentyFourHour, + ]; + + static final $core.Map<$core.int, TimeFormat> _byValue = $pb.ProtobufEnum.initByValue(values); + static TimeFormat? valueOf($core.int value) => _byValue[value]; + + const TimeFormat._($core.int v, $core.String n) : super(v, n); +} + +class MoneySymbol extends $pb.ProtobufEnum { + static const MoneySymbol CNY = MoneySymbol._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CNY'); + static const MoneySymbol EUR = MoneySymbol._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EUR'); + static const MoneySymbol USD = MoneySymbol._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'USD'); + + static const $core.List values = [ + CNY, + EUR, + USD, + ]; + + static final $core.Map<$core.int, MoneySymbol> _byValue = $pb.ProtobufEnum.initByValue(values); + static MoneySymbol? valueOf($core.int value) => _byValue[value]; + + const MoneySymbol._($core.int v, $core.String n) : super(v, n); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbjson.dart new file mode 100644 index 0000000000..71e0cf884b --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbjson.dart @@ -0,0 +1,125 @@ +/// +// Generated code. Do not modify. +// source: type_options.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use dateFormatDescriptor instead') +const DateFormat$json = const { + '1': 'DateFormat', + '2': const [ + const {'1': 'Local', '2': 0}, + const {'1': 'US', '2': 1}, + const {'1': 'ISO', '2': 2}, + const {'1': 'Friendly', '2': 3}, + ], +}; + +/// Descriptor for `DateFormat`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List dateFormatDescriptor = $convert.base64Decode('CgpEYXRlRm9ybWF0EgkKBUxvY2FsEAASBgoCVVMQARIHCgNJU08QAhIMCghGcmllbmRseRAD'); +@$core.Deprecated('Use timeFormatDescriptor instead') +const TimeFormat$json = const { + '1': 'TimeFormat', + '2': const [ + const {'1': 'TwelveHour', '2': 0}, + const {'1': 'TwentyFourHour', '2': 1}, + ], +}; + +/// Descriptor for `TimeFormat`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List timeFormatDescriptor = $convert.base64Decode('CgpUaW1lRm9ybWF0Eg4KClR3ZWx2ZUhvdXIQABISCg5Ud2VudHlGb3VySG91chAB'); +@$core.Deprecated('Use moneySymbolDescriptor instead') +const MoneySymbol$json = const { + '1': 'MoneySymbol', + '2': const [ + const {'1': 'CNY', '2': 0}, + const {'1': 'EUR', '2': 1}, + const {'1': 'USD', '2': 2}, + ], +}; + +/// Descriptor for `MoneySymbol`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List moneySymbolDescriptor = $convert.base64Decode('CgtNb25leVN5bWJvbBIHCgNDTlkQABIHCgNFVVIQARIHCgNVU0QQAg=='); +@$core.Deprecated('Use richTextDescriptionDescriptor instead') +const RichTextDescription$json = const { + '1': 'RichTextDescription', + '2': const [ + const {'1': 'format', '3': 1, '4': 1, '5': 9, '10': 'format'}, + ], +}; + +/// Descriptor for `RichTextDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List richTextDescriptionDescriptor = $convert.base64Decode('ChNSaWNoVGV4dERlc2NyaXB0aW9uEhYKBmZvcm1hdBgBIAEoCVIGZm9ybWF0'); +@$core.Deprecated('Use checkboxDescriptionDescriptor instead') +const CheckboxDescription$json = const { + '1': 'CheckboxDescription', + '2': const [ + const {'1': 'is_selected', '3': 1, '4': 1, '5': 8, '10': 'isSelected'}, + ], +}; + +/// Descriptor for `CheckboxDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List checkboxDescriptionDescriptor = $convert.base64Decode('ChNDaGVja2JveERlc2NyaXB0aW9uEh8KC2lzX3NlbGVjdGVkGAEgASgIUgppc1NlbGVjdGVk'); +@$core.Deprecated('Use dateDescriptionDescriptor instead') +const DateDescription$json = const { + '1': 'DateDescription', + '2': const [ + const {'1': 'date_format', '3': 1, '4': 1, '5': 14, '6': '.DateFormat', '10': 'dateFormat'}, + const {'1': 'time_format', '3': 2, '4': 1, '5': 14, '6': '.TimeFormat', '10': 'timeFormat'}, + ], +}; + +/// Descriptor for `DateDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List dateDescriptionDescriptor = $convert.base64Decode('Cg9EYXRlRGVzY3JpcHRpb24SLAoLZGF0ZV9mb3JtYXQYASABKA4yCy5EYXRlRm9ybWF0UgpkYXRlRm9ybWF0EiwKC3RpbWVfZm9ybWF0GAIgASgOMgsuVGltZUZvcm1hdFIKdGltZUZvcm1hdA=='); +@$core.Deprecated('Use singleSelectDescriptionDescriptor instead') +const SingleSelectDescription$json = const { + '1': 'SingleSelectDescription', + '2': const [ + const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, + const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, + ], +}; + +/// Descriptor for `SingleSelectDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List singleSelectDescriptionDescriptor = $convert.base64Decode('ChdTaW5nbGVTZWxlY3REZXNjcmlwdGlvbhInCgdvcHRpb25zGAEgAygLMg0uU2VsZWN0T3B0aW9uUgdvcHRpb25zEiMKDWRpc2FibGVfY29sb3IYAiABKAhSDGRpc2FibGVDb2xvcg=='); +@$core.Deprecated('Use multiSelectDescriptionDescriptor instead') +const MultiSelectDescription$json = const { + '1': 'MultiSelectDescription', + '2': const [ + const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, + const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, + ], +}; + +/// Descriptor for `MultiSelectDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List multiSelectDescriptionDescriptor = $convert.base64Decode('ChZNdWx0aVNlbGVjdERlc2NyaXB0aW9uEicKB29wdGlvbnMYASADKAsyDS5TZWxlY3RPcHRpb25SB29wdGlvbnMSIwoNZGlzYWJsZV9jb2xvchgCIAEoCFIMZGlzYWJsZUNvbG9y'); +@$core.Deprecated('Use selectOptionDescriptor instead') +const SelectOption$json = const { + '1': 'SelectOption', + '2': const [ + const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, + const {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'}, + const {'1': 'color', '3': 3, '4': 1, '5': 9, '10': 'color'}, + ], +}; + +/// Descriptor for `SelectOption`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List selectOptionDescriptor = $convert.base64Decode('CgxTZWxlY3RPcHRpb24SDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSFAoFY29sb3IYAyABKAlSBWNvbG9y'); +@$core.Deprecated('Use numberDescriptionDescriptor instead') +const NumberDescription$json = const { + '1': 'NumberDescription', + '2': const [ + const {'1': 'money', '3': 1, '4': 1, '5': 14, '6': '.MoneySymbol', '10': 'money'}, + const {'1': 'scale', '3': 2, '4': 1, '5': 13, '10': 'scale'}, + const {'1': 'symbol', '3': 3, '4': 1, '5': 9, '10': 'symbol'}, + const {'1': 'sign_positive', '3': 4, '4': 1, '5': 8, '10': 'signPositive'}, + const {'1': 'name', '3': 5, '4': 1, '5': 9, '10': 'name'}, + ], +}; + +/// Descriptor for `NumberDescription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List numberDescriptionDescriptor = $convert.base64Decode('ChFOdW1iZXJEZXNjcmlwdGlvbhIiCgVtb25leRgBIAEoDjIMLk1vbmV5U3ltYm9sUgVtb25leRIUCgVzY2FsZRgCIAEoDVIFc2NhbGUSFgoGc3ltYm9sGAMgASgJUgZzeW1ib2wSIwoNc2lnbl9wb3NpdGl2ZRgEIAEoCFIMc2lnblBvc2l0aXZlEhIKBG5hbWUYBSABKAlSBG5hbWU='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbserver.dart new file mode 100644 index 0000000000..b46de00bf5 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: type_options.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'type_options.pb.dart'; + diff --git a/frontend/rust-lib/Cargo.lock b/frontend/rust-lib/Cargo.lock index 6b22e06e0a..929fcad90c 100755 --- a/frontend/rust-lib/Cargo.lock +++ b/frontend/rust-lib/Cargo.lock @@ -1059,8 +1059,10 @@ dependencies = [ "flowy-database", "flowy-derive", "flowy-error", + "flowy-grid", "flowy-grid-data-model", "flowy-sync", + "flowy-test", "lazy_static", "lib-dispatch", "lib-infra", @@ -1071,6 +1073,8 @@ dependencies = [ "rayon", "rust_decimal", "rusty-money", + "serde", + "serde_json", "strum", "strum_macros", "tokio", @@ -1084,6 +1088,7 @@ version = "0.1.0" dependencies = [ "bytes", "flowy-derive", + "flowy-error-code", "lib-infra", "protobuf", "serde", @@ -1143,6 +1148,7 @@ dependencies = [ "flowy-database", "flowy-folder", "flowy-grid", + "flowy-grid-data-model", "flowy-net", "flowy-sync", "flowy-user", diff --git a/frontend/rust-lib/flowy-block/src/block_editor.rs b/frontend/rust-lib/flowy-block/src/editor.rs similarity index 87% rename from frontend/rust-lib/flowy-block/src/block_editor.rs rename to frontend/rust-lib/flowy-block/src/editor.rs index f8b0f87c6b..8622c60730 100644 --- a/frontend/rust-lib/flowy-block/src/block_editor.rs +++ b/frontend/rust-lib/flowy-block/src/editor.rs @@ -1,14 +1,13 @@ -use crate::queue::BlockRevisionCompact; use crate::web_socket::{make_block_ws_manager, EditorCommandSender}; use crate::{ errors::FlowyError, queue::{EditBlockQueue, EditorCommand}, - BlockUser, + TextBlockUser, }; use bytes::Bytes; use flowy_collaboration::entities::ws_data::ServerRevisionWSData; use flowy_collaboration::{ - entities::{document_info::BlockInfo, revision::Revision}, + entities::{revision::Revision, text_block_info::TextBlockInfo}, errors::CollaborateResult, util::make_delta_from_revisions, }; @@ -24,7 +23,7 @@ use lib_ws::WSConnectState; use std::sync::Arc; use tokio::sync::{mpsc, oneshot}; -pub struct ClientBlockEditor { +pub struct ClientTextBlockEditor { pub doc_id: String, #[allow(dead_code)] rev_manager: Arc, @@ -32,17 +31,15 @@ pub struct ClientBlockEditor { edit_cmd_tx: EditorCommandSender, } -impl ClientBlockEditor { +impl ClientTextBlockEditor { pub(crate) async fn new( doc_id: &str, - user: Arc, + user: Arc, mut rev_manager: RevisionManager, rev_web_socket: Arc, cloud_service: Arc, ) -> FlowyResult> { - let document_info = rev_manager - .load::(cloud_service) - .await?; + let document_info = rev_manager.load::(Some(cloud_service)).await?; let delta = document_info.delta()?; let rev_manager = Arc::new(rev_manager); let doc_id = doc_id.to_string(); @@ -174,7 +171,7 @@ impl ClientBlockEditor { } } -impl std::ops::Drop for ClientBlockEditor { +impl std::ops::Drop for ClientTextBlockEditor { fn drop(&mut self) { tracing::trace!("{} ClientBlockEditor was dropped", self.doc_id) } @@ -182,7 +179,7 @@ impl std::ops::Drop for ClientBlockEditor { // The edit queue will exit after the EditorCommandSender was dropped. fn spawn_edit_queue( - user: Arc, + user: Arc, rev_manager: Arc, delta: RichTextDelta, ) -> EditorCommandSender { @@ -193,18 +190,10 @@ fn spawn_edit_queue( } #[cfg(feature = "flowy_unit_test")] -impl ClientBlockEditor { - pub async fn doc_json(&self) -> FlowyResult { - let (ret, rx) = oneshot::channel::>(); - let msg = EditorCommand::ReadDeltaStr { ret }; - let _ = self.edit_cmd_tx.send(msg).await; - let s = rx.await.map_err(internal_error)??; - Ok(s) - } - - pub async fn doc_delta(&self) -> FlowyResult { +impl ClientTextBlockEditor { + pub async fn text_block_delta(&self) -> FlowyResult { let (ret, rx) = oneshot::channel::>(); - let msg = EditorCommand::ReadBlockDelta { ret }; + let msg = EditorCommand::ReadDelta { ret }; let _ = self.edit_cmd_tx.send(msg).await; let delta = rx.await.map_err(internal_error)??; Ok(delta) @@ -215,16 +204,16 @@ impl ClientBlockEditor { } } -struct BlockInfoBuilder(); -impl RevisionObjectBuilder for BlockInfoBuilder { - type Output = BlockInfo; +struct TextBlockInfoBuilder(); +impl RevisionObjectBuilder for TextBlockInfoBuilder { + type Output = TextBlockInfo; fn build_object(object_id: &str, revisions: Vec) -> FlowyResult { let (base_rev_id, rev_id) = revisions.last().unwrap().pair_rev_id(); let mut delta = make_delta_from_revisions(revisions)?; correct_delta(&mut delta); - Result::::Ok(BlockInfo { + Result::::Ok(TextBlockInfo { block_id: object_id.to_owned(), text: delta.to_delta_str(), rev_id, diff --git a/frontend/rust-lib/flowy-block/src/event_handler.rs b/frontend/rust-lib/flowy-block/src/event_handler.rs index 39761d3d7c..1457fc2992 100644 --- a/frontend/rust-lib/flowy-block/src/event_handler.rs +++ b/frontend/rust-lib/flowy-block/src/event_handler.rs @@ -1,28 +1,28 @@ use crate::entities::{ExportData, ExportParams, ExportPayload}; -use crate::BlockManager; -use flowy_collaboration::entities::document_info::{BlockDelta, BlockId}; +use crate::TextBlockManager; +use flowy_collaboration::entities::text_block_info::{TextBlockDelta, TextBlockId}; use flowy_error::FlowyError; use lib_dispatch::prelude::{data_result, AppData, Data, DataResult}; use std::convert::TryInto; use std::sync::Arc; pub(crate) async fn get_block_data_handler( - data: Data, - manager: AppData>, -) -> DataResult { - let block_id: BlockId = data.into_inner(); + data: Data, + manager: AppData>, +) -> DataResult { + let block_id: TextBlockId = data.into_inner(); let editor = manager.open_block(&block_id).await?; let delta_str = editor.delta_str().await?; - data_result(BlockDelta { + data_result(TextBlockDelta { block_id: block_id.into(), delta_str, }) } pub(crate) async fn apply_delta_handler( - data: Data, - manager: AppData>, -) -> DataResult { + data: Data, + manager: AppData>, +) -> DataResult { let block_delta = manager.receive_local_delta(data.into_inner()).await?; data_result(block_delta) } @@ -30,7 +30,7 @@ pub(crate) async fn apply_delta_handler( #[tracing::instrument(skip(data, manager), err)] pub(crate) async fn export_handler( data: Data, - manager: AppData>, + manager: AppData>, ) -> DataResult { let params: ExportParams = data.into_inner().try_into()?; let editor = manager.open_block(¶ms.view_id).await?; diff --git a/frontend/rust-lib/flowy-block/src/event_map.rs b/frontend/rust-lib/flowy-block/src/event_map.rs index f0cfda219c..8342102bf5 100644 --- a/frontend/rust-lib/flowy-block/src/event_map.rs +++ b/frontend/rust-lib/flowy-block/src/event_map.rs @@ -1,11 +1,11 @@ use crate::event_handler::*; -use crate::BlockManager; +use crate::TextBlockManager; use flowy_derive::{Flowy_Event, ProtoBuf_Enum}; use lib_dispatch::prelude::Module; use std::sync::Arc; use strum_macros::Display; -pub fn create(block_manager: Arc) -> Module { +pub fn create(block_manager: Arc) -> Module { let mut module = Module::new().name(env!("CARGO_PKG_NAME")).data(block_manager); module = module diff --git a/frontend/rust-lib/flowy-block/src/lib.rs b/frontend/rust-lib/flowy-block/src/lib.rs index 8f15fd7e31..b3c9de44dc 100644 --- a/frontend/rust-lib/flowy-block/src/lib.rs +++ b/frontend/rust-lib/flowy-block/src/lib.rs @@ -1,4 +1,4 @@ -pub mod block_editor; +pub mod editor; mod entities; mod event_handler; pub mod event_map; @@ -12,16 +12,18 @@ pub mod errors { pub use flowy_error::{internal_error, ErrorCode, FlowyError}; } -pub const DOCUMENT_SYNC_INTERVAL_IN_MILLIS: u64 = 1000; +pub const TEXT_BLOCK_SYNC_INTERVAL_IN_MILLIS: u64 = 1000; use crate::errors::FlowyError; -use flowy_collaboration::entities::document_info::{BlockId, BlockInfo, CreateBlockParams, ResetBlockParams}; +use flowy_collaboration::entities::text_block_info::{ + CreateTextBlockParams, ResetTextBlockParams, TextBlockId, TextBlockInfo, +}; use lib_infra::future::FutureResult; pub trait BlockCloudService: Send + Sync { - fn create_block(&self, token: &str, params: CreateBlockParams) -> FutureResult<(), FlowyError>; + fn create_block(&self, token: &str, params: CreateTextBlockParams) -> FutureResult<(), FlowyError>; - fn read_block(&self, token: &str, params: BlockId) -> FutureResult, FlowyError>; + fn read_block(&self, token: &str, params: TextBlockId) -> FutureResult, FlowyError>; - fn update_block(&self, token: &str, params: ResetBlockParams) -> FutureResult<(), FlowyError>; + fn update_block(&self, token: &str, params: ResetTextBlockParams) -> FutureResult<(), FlowyError>; } diff --git a/frontend/rust-lib/flowy-block/src/manager.rs b/frontend/rust-lib/flowy-block/src/manager.rs index 17ea23c7bb..a08dc9b7b1 100644 --- a/frontend/rust-lib/flowy-block/src/manager.rs +++ b/frontend/rust-lib/flowy-block/src/manager.rs @@ -1,54 +1,54 @@ -use crate::{block_editor::ClientBlockEditor, errors::FlowyError, BlockCloudService}; +use crate::{editor::ClientTextBlockEditor, errors::FlowyError, BlockCloudService}; use bytes::Bytes; use dashmap::DashMap; use flowy_collaboration::entities::{ - document_info::{BlockDelta, BlockId}, revision::{md5, RepeatedRevision, Revision}, + text_block_info::{TextBlockDelta, TextBlockId}, ws_data::ServerRevisionWSData, }; use flowy_database::ConnectionPool; use flowy_error::FlowyResult; +use flowy_sync::disk::SQLiteTextBlockRevisionPersistence; use flowy_sync::{RevisionCloudService, RevisionManager, RevisionPersistence, RevisionWebSocket}; use lib_infra::future::FutureResult; use std::{convert::TryInto, sync::Arc}; -pub trait BlockUser: Send + Sync { +pub trait TextBlockUser: Send + Sync { fn user_dir(&self) -> Result; fn user_id(&self) -> Result; fn token(&self) -> Result; fn db_pool(&self) -> Result, FlowyError>; } -pub struct BlockManager { +pub struct TextBlockManager { cloud_service: Arc, rev_web_socket: Arc, - block_editors: Arc, - block_user: Arc, + editor_map: Arc, + user: Arc, } -impl BlockManager { +impl TextBlockManager { pub fn new( cloud_service: Arc, - block_user: Arc, + text_block_user: Arc, rev_web_socket: Arc, ) -> Self { - let block_editors = Arc::new(BlockEditors::new()); Self { cloud_service, rev_web_socket, - block_editors, - block_user, + editor_map: Arc::new(TextBlockEditorMap::new()), + user: text_block_user, } } pub fn init(&self) -> FlowyResult<()> { - listen_ws_state_changed(self.rev_web_socket.clone(), self.block_editors.clone()); + listen_ws_state_changed(self.rev_web_socket.clone(), self.editor_map.clone()); Ok(()) } #[tracing::instrument(level = "debug", skip(self, block_id), fields(block_id), err)] - pub async fn open_block>(&self, block_id: T) -> Result, FlowyError> { + pub async fn open_block>(&self, block_id: T) -> Result, FlowyError> { let block_id = block_id.as_ref(); tracing::Span::current().record("block_id", &block_id); self.get_block_editor(block_id).await @@ -58,7 +58,7 @@ impl BlockManager { pub fn close_block>(&self, block_id: T) -> Result<(), FlowyError> { let block_id = block_id.as_ref(); tracing::Span::current().record("block_id", &block_id); - self.block_editors.remove(block_id); + self.editor_map.remove(block_id); Ok(()) } @@ -66,16 +66,16 @@ impl BlockManager { pub fn delete_block>(&self, doc_id: T) -> Result<(), FlowyError> { let doc_id = doc_id.as_ref(); tracing::Span::current().record("doc_id", &doc_id); - self.block_editors.remove(doc_id); + self.editor_map.remove(doc_id); Ok(()) } #[tracing::instrument(level = "debug", skip(self, delta), fields(doc_id = %delta.block_id), err)] - pub async fn receive_local_delta(&self, delta: BlockDelta) -> Result { + pub async fn receive_local_delta(&self, delta: TextBlockDelta) -> Result { let editor = self.get_block_editor(&delta.block_id).await?; let _ = editor.compose_local_delta(Bytes::from(delta.delta_str)).await?; let document_json = editor.delta_str().await?; - Ok(BlockDelta { + Ok(TextBlockDelta { block_id: delta.block_id.clone(), delta_str: document_json, }) @@ -83,9 +83,9 @@ impl BlockManager { pub async fn create_block>(&self, doc_id: T, revisions: RepeatedRevision) -> FlowyResult<()> { let doc_id = doc_id.as_ref().to_owned(); - let db_pool = self.block_user.db_pool()?; + let db_pool = self.user.db_pool()?; // Maybe we could save the block to disk without creating the RevisionManager - let rev_manager = self.make_block_rev_manager(&doc_id, db_pool)?; + let rev_manager = self.make_rev_manager(&doc_id, db_pool)?; let _ = rev_manager.reset_object(revisions).await?; Ok(()) } @@ -93,9 +93,9 @@ impl BlockManager { pub async fn receive_ws_data(&self, data: Bytes) { let result: Result = data.try_into(); match result { - Ok(data) => match self.block_editors.get(&data.object_id) { + Ok(data) => match self.editor_map.get(&data.object_id) { None => tracing::error!("Can't find any source handler for {:?}-{:?}", data.object_id, data.ty), - Some(block_editor) => match block_editor.receive_ws_data(data).await { + Some(editor) => match editor.receive_ws_data(data).await { Ok(_) => {} Err(e) => tracing::error!("{}", e), }, @@ -107,51 +107,52 @@ impl BlockManager { } } -impl BlockManager { - async fn get_block_editor(&self, block_id: &str) -> FlowyResult> { - match self.block_editors.get(block_id) { +impl TextBlockManager { + async fn get_block_editor(&self, block_id: &str) -> FlowyResult> { + match self.editor_map.get(block_id) { None => { - let db_pool = self.block_user.db_pool()?; - self.make_block_editor(block_id, db_pool).await + let db_pool = self.user.db_pool()?; + self.make_text_block_editor(block_id, db_pool).await } Some(editor) => Ok(editor), } } - async fn make_block_editor( + async fn make_text_block_editor( &self, block_id: &str, pool: Arc, - ) -> Result, FlowyError> { - let user = self.block_user.clone(); - let token = self.block_user.token()?; - let rev_manager = self.make_block_rev_manager(block_id, pool.clone())?; - let cloud_service = Arc::new(BlockRevisionCloudService { + ) -> Result, FlowyError> { + let user = self.user.clone(); + let token = self.user.token()?; + let rev_manager = self.make_rev_manager(block_id, pool.clone())?; + let cloud_service = Arc::new(TextBlockRevisionCloudService { token, server: self.cloud_service.clone(), }); let doc_editor = - ClientBlockEditor::new(block_id, user, rev_manager, self.rev_web_socket.clone(), cloud_service).await?; - self.block_editors.insert(block_id, &doc_editor); + ClientTextBlockEditor::new(block_id, user, rev_manager, self.rev_web_socket.clone(), cloud_service).await?; + self.editor_map.insert(block_id, &doc_editor); Ok(doc_editor) } - fn make_block_rev_manager(&self, doc_id: &str, pool: Arc) -> Result { - let user_id = self.block_user.user_id()?; - let rev_persistence = Arc::new(RevisionPersistence::new(&user_id, doc_id, pool)); + fn make_rev_manager(&self, doc_id: &str, pool: Arc) -> Result { + let user_id = self.user.user_id()?; + let disk_cache = Arc::new(SQLiteTextBlockRevisionPersistence::new(&user_id, pool)); + let rev_persistence = Arc::new(RevisionPersistence::new(&user_id, doc_id, disk_cache)); Ok(RevisionManager::new(&user_id, doc_id, rev_persistence)) } } -struct BlockRevisionCloudService { +struct TextBlockRevisionCloudService { token: String, server: Arc, } -impl RevisionCloudService for BlockRevisionCloudService { +impl RevisionCloudService for TextBlockRevisionCloudService { #[tracing::instrument(level = "trace", skip(self))] fn fetch_object(&self, user_id: &str, object_id: &str) -> FutureResult, FlowyError> { - let params: BlockId = object_id.to_string().into(); + let params: TextBlockId = object_id.to_string().into(); let server = self.server.clone(); let token = self.token.clone(); let user_id = user_id.to_string(); @@ -177,32 +178,24 @@ impl RevisionCloudService for BlockRevisionCloudService { } } -pub struct BlockEditors { - inner: DashMap>, +pub struct TextBlockEditorMap { + inner: DashMap>, } -impl BlockEditors { +impl TextBlockEditorMap { fn new() -> Self { Self { inner: DashMap::new() } } - pub(crate) fn insert(&self, block_id: &str, doc: &Arc) { + pub(crate) fn insert(&self, block_id: &str, doc: &Arc) { if self.inner.contains_key(block_id) { log::warn!("Doc:{} already exists in cache", block_id); } self.inner.insert(block_id.to_string(), doc.clone()); } - pub(crate) fn contains(&self, block_id: &str) -> bool { - self.inner.get(block_id).is_some() - } - - pub(crate) fn get(&self, block_id: &str) -> Option> { - if !self.contains(block_id) { - return None; - } - let opened_doc = self.inner.get(block_id).unwrap(); - Some(opened_doc.clone()) + pub(crate) fn get(&self, block_id: &str) -> Option> { + Some(self.inner.get(block_id)?.clone()) } pub(crate) fn remove(&self, block_id: &str) { @@ -214,7 +207,7 @@ impl BlockEditors { } #[tracing::instrument(level = "trace", skip(web_socket, handlers))] -fn listen_ws_state_changed(web_socket: Arc, handlers: Arc) { +fn listen_ws_state_changed(web_socket: Arc, handlers: Arc) { tokio::spawn(async move { let mut notify = web_socket.subscribe_state_changed().await; while let Ok(state) = notify.recv().await { diff --git a/frontend/rust-lib/flowy-block/src/queue.rs b/frontend/rust-lib/flowy-block/src/queue.rs index 96e4e50f17..f7932e0850 100644 --- a/frontend/rust-lib/flowy-block/src/queue.rs +++ b/frontend/rust-lib/flowy-block/src/queue.rs @@ -1,6 +1,7 @@ use crate::web_socket::EditorCommandReceiver; -use crate::BlockUser; +use crate::TextBlockUser; use async_stream::stream; +use bytes::Bytes; use flowy_collaboration::util::make_delta_from_revisions; use flowy_collaboration::{ client_document::{history::UndoResult, ClientDocument}, @@ -8,7 +9,7 @@ use flowy_collaboration::{ errors::CollaborateError, }; use flowy_error::{FlowyError, FlowyResult}; -use flowy_sync::{DeltaMD5, RevisionCompact, RevisionManager, RichTextTransformDeltas, TransformDeltas}; +use flowy_sync::{DeltaMD5, RevisionCompactor, RevisionManager, RichTextTransformDeltas, TransformDeltas}; use futures::stream::StreamExt; use lib_ot::{ core::{Interval, OperationTransformable}, @@ -21,14 +22,14 @@ use tokio::sync::{oneshot, RwLock}; // serial. pub(crate) struct EditBlockQueue { document: Arc>, - user: Arc, + user: Arc, rev_manager: Arc, receiver: Option, } impl EditBlockQueue { pub(crate) fn new( - user: Arc, + user: Arc, rev_manager: Arc, delta: RichTextDelta, receiver: EditorCommandReceiver, @@ -165,7 +166,7 @@ impl EditBlockQueue { let data = self.document.read().await.delta_str(); let _ = ret.send(Ok(data)); } - EditorCommand::ReadBlockDelta { ret } => { + EditorCommand::ReadDelta { ret } => { let delta = self.document.read().await.delta().clone(); let _ = ret.send(Ok(delta)); } @@ -174,7 +175,7 @@ impl EditBlockQueue { } async fn save_local_delta(&self, delta: RichTextDelta, md5: String) -> Result { - let delta_data = delta.to_bytes(); + let delta_data = delta.to_delta_bytes(); let (base_rev_id, rev_id) = self.rev_manager.next_rev_id_pair(); let user_id = self.user.user_id()?; let revision = Revision::new( @@ -187,31 +188,17 @@ impl EditBlockQueue { ); let _ = self .rev_manager - .add_local_revision::(&revision) + .add_local_revision(&revision, Box::new(TextBlockRevisionCompactor())) .await?; Ok(rev_id.into()) } } -pub(crate) struct BlockRevisionCompact(); -impl RevisionCompact for BlockRevisionCompact { - fn compact_revisions(user_id: &str, object_id: &str, mut revisions: Vec) -> FlowyResult { - if revisions.is_empty() { - return Err(FlowyError::internal().context("Can't compact the empty block's revisions")); - } - - if revisions.len() == 1 { - return Ok(revisions.pop().unwrap()); - } - - let first_revision = revisions.first().unwrap(); - let last_revision = revisions.last().unwrap(); - - let (base_rev_id, rev_id) = first_revision.pair_rev_id(); - let md5 = last_revision.md5.clone(); +pub(crate) struct TextBlockRevisionCompactor(); +impl RevisionCompactor for TextBlockRevisionCompactor { + fn bytes_from_revisions(&self, revisions: Vec) -> FlowyResult { let delta = make_delta_from_revisions::(revisions)?; - let delta_data = delta.to_bytes(); - Ok(Revision::new(object_id, base_rev_id, rev_id, delta_data, user_id, md5)) + Ok(delta.to_delta_bytes()) } } @@ -269,7 +256,7 @@ pub(crate) enum EditorCommand { ret: Ret, }, #[allow(dead_code)] - ReadBlockDelta { + ReadDelta { ret: Ret, }, } @@ -290,7 +277,7 @@ impl std::fmt::Debug for EditorCommand { EditorCommand::Undo { .. } => "Undo", EditorCommand::Redo { .. } => "Redo", EditorCommand::ReadDeltaStr { .. } => "ReadDeltaStr", - EditorCommand::ReadBlockDelta { .. } => "ReadDocumentAsDelta", + EditorCommand::ReadDelta { .. } => "ReadDocumentAsDelta", }; f.write_str(s) } diff --git a/frontend/rust-lib/flowy-block/src/web_socket.rs b/frontend/rust-lib/flowy-block/src/web_socket.rs index 27ec604129..7450e4a6ae 100644 --- a/frontend/rust-lib/flowy-block/src/web_socket.rs +++ b/frontend/rust-lib/flowy-block/src/web_socket.rs @@ -1,4 +1,4 @@ -use crate::{queue::EditorCommand, DOCUMENT_SYNC_INTERVAL_IN_MILLIS}; +use crate::{queue::EditorCommand, TEXT_BLOCK_SYNC_INTERVAL_IN_MILLIS}; use bytes::Bytes; use flowy_collaboration::{ entities::{ @@ -31,12 +31,12 @@ pub(crate) async fn make_block_ws_manager( rev_web_socket: Arc, ) -> Arc { let ws_data_provider = Arc::new(WSDataProvider::new(&doc_id, Arc::new(rev_manager.clone()))); - let resolver = Arc::new(BlockConflictResolver { edit_cmd_tx }); + let resolver = Arc::new(TextBlockConflictResolver { edit_cmd_tx }); let conflict_controller = RichTextConflictController::new(&user_id, resolver, Arc::new(ws_data_provider.clone()), rev_manager); - let ws_data_stream = Arc::new(BlockRevisionWSDataStream::new(conflict_controller)); - let ws_data_sink = Arc::new(BlockWSDataSink(ws_data_provider)); - let ping_duration = Duration::from_millis(DOCUMENT_SYNC_INTERVAL_IN_MILLIS); + let ws_data_stream = Arc::new(TextBlockRevisionWSDataStream::new(conflict_controller)); + let ws_data_sink = Arc::new(TextBlockWSDataSink(ws_data_provider)); + let ping_duration = Duration::from_millis(TEXT_BLOCK_SYNC_INTERVAL_IN_MILLIS); let ws_manager = Arc::new(RevisionWebSocketManager::new( "Block", &doc_id, @@ -62,11 +62,11 @@ fn listen_document_ws_state(_user_id: &str, _doc_id: &str, mut subscriber: broad }); } -pub(crate) struct BlockRevisionWSDataStream { +pub(crate) struct TextBlockRevisionWSDataStream { conflict_controller: Arc, } -impl BlockRevisionWSDataStream { +impl TextBlockRevisionWSDataStream { pub fn new(conflict_controller: RichTextConflictController) -> Self { Self { conflict_controller: Arc::new(conflict_controller), @@ -74,7 +74,7 @@ impl BlockRevisionWSDataStream { } } -impl RevisionWSDataStream for BlockRevisionWSDataStream { +impl RevisionWSDataStream for TextBlockRevisionWSDataStream { fn receive_push_revision(&self, bytes: Bytes) -> BoxResultFuture<(), FlowyError> { let resolver = self.conflict_controller.clone(); Box::pin(async move { resolver.receive_bytes(bytes).await }) @@ -96,19 +96,19 @@ impl RevisionWSDataStream for BlockRevisionWSDataStream { } } -pub(crate) struct BlockWSDataSink(pub(crate) Arc); -impl RevisionWebSocketSink for BlockWSDataSink { +pub(crate) struct TextBlockWSDataSink(pub(crate) Arc); +impl RevisionWebSocketSink for TextBlockWSDataSink { fn next(&self) -> FutureResult, FlowyError> { let sink_provider = self.0.clone(); FutureResult::new(async move { sink_provider.next().await }) } } -struct BlockConflictResolver { +struct TextBlockConflictResolver { edit_cmd_tx: EditorCommandSender, } -impl ConflictResolver for BlockConflictResolver { +impl ConflictResolver for TextBlockConflictResolver { fn compose_delta(&self, delta: RichTextDelta) -> BoxResultFuture { let tx = self.edit_cmd_tx.clone(); Box::pin(async move { diff --git a/frontend/rust-lib/flowy-block/tests/document/mod.rs b/frontend/rust-lib/flowy-block/tests/document/mod.rs index 252787043a..8aa4c774ed 100644 --- a/frontend/rust-lib/flowy-block/tests/document/mod.rs +++ b/frontend/rust-lib/flowy-block/tests/document/mod.rs @@ -1,2 +1,2 @@ -mod document_test; -mod edit_script; +mod script; +mod text_block_test; diff --git a/frontend/rust-lib/flowy-block/tests/document/edit_script.rs b/frontend/rust-lib/flowy-block/tests/document/script.rs similarity index 81% rename from frontend/rust-lib/flowy-block/tests/document/edit_script.rs rename to frontend/rust-lib/flowy-block/tests/document/script.rs index 0109302e96..2ae6e14fc9 100644 --- a/frontend/rust-lib/flowy-block/tests/document/edit_script.rs +++ b/frontend/rust-lib/flowy-block/tests/document/script.rs @@ -1,6 +1,6 @@ -use flowy_block::block_editor::ClientBlockEditor; -use flowy_block::DOCUMENT_SYNC_INTERVAL_IN_MILLIS; -use flowy_collaboration::entities::revision::RevisionState; +use flowy_block::editor::ClientTextBlockEditor; +use flowy_block::TEXT_BLOCK_SYNC_INTERVAL_IN_MILLIS; +use flowy_sync::disk::RevisionState; use flowy_test::{helper::ViewTest, FlowySDKTest}; use lib_ot::{core::Interval, rich_text::RichTextDelta}; use std::sync::Arc; @@ -17,17 +17,17 @@ pub enum EditorScript { AssertJson(&'static str), } -pub struct EditorTest { +pub struct TextBlockEditorTest { pub sdk: FlowySDKTest, - pub editor: Arc, + pub editor: Arc, } -impl EditorTest { +impl TextBlockEditorTest { pub async fn new() -> Self { let sdk = FlowySDKTest::default(); let _ = sdk.init_user().await; - let test = ViewTest::new(&sdk).await; - let editor = sdk.block_manager.open_block(&test.view.id).await.unwrap(); + let test = ViewTest::new_text_block_view(&sdk).await; + let editor = sdk.text_block_manager.open_block(&test.view.id).await.unwrap(); Self { sdk, editor } } @@ -41,8 +41,6 @@ impl EditorTest { let rev_manager = self.editor.rev_manager(); let cache = rev_manager.revision_cache().await; let _user_id = self.sdk.user_session.user_id().unwrap(); - // let ws_manager = self.sdk.ws_conn.clone(); - // let token = self.sdk.user_session.token().unwrap(); match script { EditorScript::InsertText(s, offset) => { @@ -74,7 +72,7 @@ impl EditorTest { } EditorScript::AssertJson(expected) => { let expected_delta: RichTextDelta = serde_json::from_str(expected).unwrap(); - let delta = self.editor.doc_delta().await.unwrap(); + let delta = self.editor.text_block_delta().await.unwrap(); if expected_delta != delta { eprintln!("✅ expect: {}", expected,); eprintln!("❌ receive: {}", delta.to_delta_str()); @@ -82,6 +80,6 @@ impl EditorTest { assert_eq!(expected_delta, delta); } } - sleep(Duration::from_millis(DOCUMENT_SYNC_INTERVAL_IN_MILLIS)).await; + sleep(Duration::from_millis(TEXT_BLOCK_SYNC_INTERVAL_IN_MILLIS)).await; } } diff --git a/frontend/rust-lib/flowy-block/tests/document/document_test.rs b/frontend/rust-lib/flowy-block/tests/document/text_block_test.rs similarity index 68% rename from frontend/rust-lib/flowy-block/tests/document/document_test.rs rename to frontend/rust-lib/flowy-block/tests/document/text_block_test.rs index 86fd1d4a2e..93fb957cdb 100644 --- a/frontend/rust-lib/flowy-block/tests/document/document_test.rs +++ b/frontend/rust-lib/flowy-block/tests/document/text_block_test.rs @@ -1,9 +1,9 @@ -use crate::document::edit_script::{EditorScript::*, *}; -use flowy_collaboration::entities::revision::RevisionState; +use crate::document::script::{EditorScript::*, *}; +use flowy_sync::disk::RevisionState; use lib_ot::core::{count_utf16_code_units, Interval}; #[tokio::test] -async fn document_sync_current_rev_id_check() { +async fn text_block_sync_current_rev_id_check() { let scripts = vec![ InsertText("1", 0), AssertCurrentRevId(1), @@ -14,11 +14,11 @@ async fn document_sync_current_rev_id_check() { AssertNextSyncRevId(None), AssertJson(r#"[{"insert":"123\n"}]"#), ]; - EditorTest::new().await.run_scripts(scripts).await; + TextBlockEditorTest::new().await.run_scripts(scripts).await; } #[tokio::test] -async fn document_sync_state_check() { +async fn text_block_sync_state_check() { let scripts = vec![ InsertText("1", 0), InsertText("2", 1), @@ -28,11 +28,11 @@ async fn document_sync_state_check() { AssertRevisionState(3, RevisionState::Ack), AssertJson(r#"[{"insert":"123\n"}]"#), ]; - EditorTest::new().await.run_scripts(scripts).await; + TextBlockEditorTest::new().await.run_scripts(scripts).await; } #[tokio::test] -async fn document_sync_insert_test() { +async fn text_block_sync_insert_test() { let scripts = vec![ InsertText("1", 0), InsertText("2", 1), @@ -40,11 +40,11 @@ async fn document_sync_insert_test() { AssertJson(r#"[{"insert":"123\n"}]"#), AssertNextSyncRevId(None), ]; - EditorTest::new().await.run_scripts(scripts).await; + TextBlockEditorTest::new().await.run_scripts(scripts).await; } #[tokio::test] -async fn document_sync_insert_in_chinese() { +async fn text_block_sync_insert_in_chinese() { let s = "好".to_owned(); let offset = count_utf16_code_units(&s); let scripts = vec![ @@ -52,11 +52,11 @@ async fn document_sync_insert_in_chinese() { InsertText("好", offset), AssertJson(r#"[{"insert":"你好\n"}]"#), ]; - EditorTest::new().await.run_scripts(scripts).await; + TextBlockEditorTest::new().await.run_scripts(scripts).await; } #[tokio::test] -async fn document_sync_insert_with_emoji() { +async fn text_block_sync_insert_with_emoji() { let s = "😁".to_owned(); let offset = count_utf16_code_units(&s); let scripts = vec![ @@ -64,11 +64,11 @@ async fn document_sync_insert_with_emoji() { InsertText("☺️", offset), AssertJson(r#"[{"insert":"😁☺️\n"}]"#), ]; - EditorTest::new().await.run_scripts(scripts).await; + TextBlockEditorTest::new().await.run_scripts(scripts).await; } #[tokio::test] -async fn document_sync_delete_in_english() { +async fn text_block_sync_delete_in_english() { let scripts = vec![ InsertText("1", 0), InsertText("2", 1), @@ -76,11 +76,11 @@ async fn document_sync_delete_in_english() { Delete(Interval::new(0, 2)), AssertJson(r#"[{"insert":"3\n"}]"#), ]; - EditorTest::new().await.run_scripts(scripts).await; + TextBlockEditorTest::new().await.run_scripts(scripts).await; } #[tokio::test] -async fn document_sync_delete_in_chinese() { +async fn text_block_sync_delete_in_chinese() { let s = "好".to_owned(); let offset = count_utf16_code_units(&s); let scripts = vec![ @@ -89,11 +89,11 @@ async fn document_sync_delete_in_chinese() { Delete(Interval::new(0, offset)), AssertJson(r#"[{"insert":"好\n"}]"#), ]; - EditorTest::new().await.run_scripts(scripts).await; + TextBlockEditorTest::new().await.run_scripts(scripts).await; } #[tokio::test] -async fn document_sync_replace_test() { +async fn text_block_sync_replace_test() { let scripts = vec![ InsertText("1", 0), InsertText("2", 1), @@ -101,5 +101,5 @@ async fn document_sync_replace_test() { Replace(Interval::new(0, 3), "abc"), AssertJson(r#"[{"insert":"abc\n"}]"#), ]; - EditorTest::new().await.run_scripts(scripts).await; + TextBlockEditorTest::new().await.run_scripts(scripts).await; } diff --git a/frontend/rust-lib/flowy-block/tests/editor/attribute_test.rs b/frontend/rust-lib/flowy-block/tests/editor/attribute_test.rs index fb91e8125c..264cee831b 100644 --- a/frontend/rust-lib/flowy-block/tests/editor/attribute_test.rs +++ b/frontend/rust-lib/flowy-block/tests/editor/attribute_test.rs @@ -762,12 +762,12 @@ fn attributes_preserve_list_format_on_merge() { #[test] fn delta_compose() { - let mut delta = RichTextDelta::from_json(r#"[{"insert":"\n"}]"#).unwrap(); + let mut delta = RichTextDelta::from_delta_str(r#"[{"insert":"\n"}]"#).unwrap(); let deltas = vec![ - RichTextDelta::from_json(r#"[{"retain":1,"attributes":{"list":"unchecked"}}]"#).unwrap(), - RichTextDelta::from_json(r#"[{"insert":"a"}]"#).unwrap(), - RichTextDelta::from_json(r#"[{"retain":1},{"insert":"\n","attributes":{"list":"unchecked"}}]"#).unwrap(), - RichTextDelta::from_json(r#"[{"retain":2},{"retain":1,"attributes":{"list":""}}]"#).unwrap(), + RichTextDelta::from_delta_str(r#"[{"retain":1,"attributes":{"list":"unchecked"}}]"#).unwrap(), + RichTextDelta::from_delta_str(r#"[{"insert":"a"}]"#).unwrap(), + RichTextDelta::from_delta_str(r#"[{"retain":1},{"insert":"\n","attributes":{"list":"unchecked"}}]"#).unwrap(), + RichTextDelta::from_delta_str(r#"[{"retain":2},{"retain":1,"attributes":{"list":""}}]"#).unwrap(), ]; for d in deltas { diff --git a/frontend/rust-lib/flowy-block/tests/editor/serde_test.rs b/frontend/rust-lib/flowy-block/tests/editor/serde_test.rs index 71c5e64dc3..54c7f92152 100644 --- a/frontend/rust-lib/flowy-block/tests/editor/serde_test.rs +++ b/frontend/rust-lib/flowy-block/tests/editor/serde_test.rs @@ -65,7 +65,7 @@ fn delta_serialize_multi_attribute_test() { let json = serde_json::to_string(&delta).unwrap(); eprintln!("{}", json); - let delta_from_json = Delta::from_json(&json).unwrap(); + let delta_from_json = Delta::from_delta_str(&json).unwrap(); assert_eq!(delta_from_json, delta); } @@ -77,7 +77,7 @@ fn delta_deserialize_test() { {"retain":2,"attributes":{"italic":"true","bold":"true"}}, {"retain":2,"attributes":{"italic":true,"bold":true}} ]"#; - let delta = RichTextDelta::from_json(json).unwrap(); + let delta = RichTextDelta::from_delta_str(json).unwrap(); eprintln!("{}", delta); } @@ -86,7 +86,7 @@ fn delta_deserialize_null_test() { let json = r#"[ {"retain":7,"attributes":{"bold":null}} ]"#; - let delta1 = RichTextDelta::from_json(json).unwrap(); + let delta1 = RichTextDelta::from_delta_str(json).unwrap(); let mut attribute = RichTextAttribute::Bold(true); attribute.value = RichTextAttributeValue(None); diff --git a/frontend/rust-lib/flowy-database/migrations/2022-03-11-025536_flowy-grid/down.sql b/frontend/rust-lib/flowy-database/migrations/2022-03-11-025536_flowy-grid/down.sql new file mode 100644 index 0000000000..9d48f0fb8a --- /dev/null +++ b/frontend/rust-lib/flowy-database/migrations/2022-03-11-025536_flowy-grid/down.sql @@ -0,0 +1,3 @@ +-- This file should undo anything in `up.sql` +DROP TABLE grid_rev_table; +DROP TABLE grid_meta_rev_table; \ No newline at end of file diff --git a/frontend/rust-lib/flowy-database/migrations/2022-03-11-025536_flowy-grid/up.sql b/frontend/rust-lib/flowy-database/migrations/2022-03-11-025536_flowy-grid/up.sql new file mode 100644 index 0000000000..4ce278ec8f --- /dev/null +++ b/frontend/rust-lib/flowy-database/migrations/2022-03-11-025536_flowy-grid/up.sql @@ -0,0 +1,18 @@ +-- Your SQL goes here +CREATE TABLE grid_rev_table ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + object_id TEXT NOT NULL DEFAULT '', + base_rev_id BIGINT NOT NULL DEFAULT 0, + rev_id BIGINT NOT NULL DEFAULT 0, + data BLOB NOT NULL DEFAULT (x''), + state INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE grid_meta_rev_table ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + object_id TEXT NOT NULL DEFAULT '', + base_rev_id BIGINT NOT NULL DEFAULT 0, + rev_id BIGINT NOT NULL DEFAULT 0, + data BLOB NOT NULL DEFAULT (x''), + state INTEGER NOT NULL DEFAULT 0 +); \ No newline at end of file diff --git a/frontend/rust-lib/flowy-database/src/macros.rs b/frontend/rust-lib/flowy-database/src/macros.rs index 9ef9740fee..e1534bf25f 100644 --- a/frontend/rust-lib/flowy-database/src/macros.rs +++ b/frontend/rust-lib/flowy-database/src/macros.rs @@ -160,3 +160,39 @@ macro_rules! impl_sql_integer_expression { } }; } + +#[macro_export] +macro_rules! impl_rev_state_map { + ($target:ident) => { + impl std::convert::From for $target { + fn from(value: i32) -> Self { + match value { + 0 => $target::Sync, + 1 => $target::Ack, + o => { + tracing::error!("Unsupported rev state {}, fallback to RevState::Local", o); + $target::Sync + } + } + } + } + + impl std::convert::From<$target> for RevisionState { + fn from(s: $target) -> Self { + match s { + $target::Sync => RevisionState::Sync, + $target::Ack => RevisionState::Ack, + } + } + } + + impl std::convert::From for $target { + fn from(s: RevisionState) -> Self { + match s { + RevisionState::Sync => $target::Sync, + RevisionState::Ack => $target::Ack, + } + } + } + }; +} diff --git a/frontend/rust-lib/flowy-database/src/schema.rs b/frontend/rust-lib/flowy-database/src/schema.rs index aa7200000e..6be116e806 100644 --- a/frontend/rust-lib/flowy-database/src/schema.rs +++ b/frontend/rust-lib/flowy-database/src/schema.rs @@ -21,6 +21,28 @@ table! { } } +table! { + grid_meta_rev_table (id) { + id -> Integer, + object_id -> Text, + base_rev_id -> BigInt, + rev_id -> BigInt, + data -> Binary, + state -> Integer, + } +} + +table! { + grid_rev_table (id) { + id -> Integer, + object_id -> Text, + base_rev_id -> BigInt, + rev_id -> BigInt, + data -> Binary, + state -> Integer, + } +} + table! { kv_table (key) { key -> Text, @@ -91,6 +113,8 @@ table! { allow_tables_to_appear_in_same_query!( app_table, doc_table, + grid_meta_rev_table, + grid_rev_table, kv_table, rev_table, trash_table, diff --git a/frontend/rust-lib/flowy-error/src/errors.rs b/frontend/rust-lib/flowy-error/src/errors.rs index 956df16fa5..cd890fd02e 100644 --- a/frontend/rust-lib/flowy-error/src/errors.rs +++ b/frontend/rust-lib/flowy-error/src/errors.rs @@ -64,6 +64,8 @@ impl FlowyError { static_flowy_error!(name_empty, ErrorCode::UserNameIsEmpty); static_flowy_error!(user_id, ErrorCode::UserIdInvalid); static_flowy_error!(user_not_exist, ErrorCode::UserNotExist); + static_flowy_error!(text_too_long, ErrorCode::TextTooLong); + static_flowy_error!(invalid_data, ErrorCode::InvalidData); } impl std::convert::From for FlowyError { diff --git a/frontend/rust-lib/flowy-folder/src/manager.rs b/frontend/rust-lib/flowy-folder/src/manager.rs index b41539d628..8fe34a2065 100644 --- a/frontend/rust-lib/flowy-folder/src/manager.rs +++ b/frontend/rust-lib/flowy-folder/src/manager.rs @@ -12,12 +12,13 @@ use bytes::Bytes; use chrono::Utc; use flowy_collaboration::client_document::default::{initial_quill_delta_string, initial_read_me}; -use flowy_collaboration::entities::revision::RepeatedRevision; + use flowy_collaboration::{client_folder::FolderPad, entities::ws_data::ServerRevisionWSData}; use flowy_error::FlowyError; use flowy_folder_data_model::entities::view::ViewDataType; use flowy_folder_data_model::user_default; -use flowy_sync::RevisionWebSocket; +use flowy_sync::disk::SQLiteTextBlockRevisionPersistence; +use flowy_sync::{RevisionManager, RevisionPersistence, RevisionWebSocket}; use lazy_static::lazy_static; use lib_infra::future::FutureResult; use std::{collections::HashMap, convert::TryInto, fmt::Formatter, sync::Arc}; @@ -163,7 +164,12 @@ impl FolderManager { let _ = self.persistence.initialize(user_id, &folder_id).await?; let pool = self.persistence.db_pool()?; - let folder_editor = ClientFolderEditor::new(user_id, &folder_id, token, pool, self.web_socket.clone()).await?; + let disk_cache = Arc::new(SQLiteTextBlockRevisionPersistence::new(user_id, pool)); + let rev_persistence = Arc::new(RevisionPersistence::new(user_id, folder_id.as_ref(), disk_cache)); + let rev_manager = RevisionManager::new(user_id, folder_id.as_ref(), rev_persistence); + + let folder_editor = + ClientFolderEditor::new(user_id, &folder_id, token, rev_manager, self.web_socket.clone()).await?; *self.folder_editor.write().await = Some(Arc::new(folder_editor)); let _ = self.app_controller.initialize()?; @@ -208,7 +214,7 @@ impl DefaultFolderBuilder { }; let _ = view_controller.set_latest_view(&view.id); let _ = view_controller - .create_view(&view.id, ViewDataType::Block, Bytes::from(view_data)) + .create_view(&view.id, ViewDataType::TextBlock, Bytes::from(view_data)) .await?; } } @@ -233,15 +239,17 @@ impl FolderManager { pub trait ViewDataProcessor { fn initialize(&self) -> FutureResult<(), FlowyError>; - fn create_container(&self, view_id: &str, repeated_revision: RepeatedRevision) -> FutureResult<(), FlowyError>; + fn create_container(&self, user_id: &str, view_id: &str, delta_data: Bytes) -> FutureResult<(), FlowyError>; fn delete_container(&self, view_id: &str) -> FutureResult<(), FlowyError>; fn close_container(&self, view_id: &str) -> FutureResult<(), FlowyError>; - fn delta_str(&self, view_id: &str) -> FutureResult; + fn delta_bytes(&self, view_id: &str) -> FutureResult; - fn default_view_data(&self, view_id: &str) -> String; + fn create_default_view(&self, user_id: &str, view_id: &str) -> FutureResult; + + fn process_create_view_data(&self, user_id: &str, view_id: &str, data: Vec) -> FutureResult; fn data_type(&self) -> ViewDataType; } diff --git a/frontend/rust-lib/flowy-folder/src/services/folder_editor.rs b/frontend/rust-lib/flowy-folder/src/services/folder_editor.rs index 536eef4c9f..48c83cc612 100644 --- a/frontend/rust-lib/flowy-folder/src/services/folder_editor.rs +++ b/frontend/rust-lib/flowy-folder/src/services/folder_editor.rs @@ -5,15 +5,17 @@ use flowy_collaboration::{ }; use crate::manager::FolderId; +use bytes::Bytes; use flowy_collaboration::util::make_delta_from_revisions; use flowy_error::{FlowyError, FlowyResult}; + use flowy_sync::{ - RevisionCloudService, RevisionCompact, RevisionManager, RevisionObjectBuilder, RevisionPersistence, - RevisionWebSocket, RevisionWebSocketManager, + RevisionCloudService, RevisionCompactor, RevisionManager, RevisionObjectBuilder, RevisionWebSocket, + RevisionWebSocketManager, }; use lib_infra::future::FutureResult; use lib_ot::core::PlainTextAttributes; -use lib_sqlite::ConnectionPool; + use parking_lot::RwLock; use std::sync::Arc; @@ -30,19 +32,13 @@ impl ClientFolderEditor { user_id: &str, folder_id: &FolderId, token: &str, - pool: Arc, + mut rev_manager: RevisionManager, web_socket: Arc, ) -> FlowyResult { - let rev_persistence = Arc::new(RevisionPersistence::new(user_id, folder_id.as_ref(), pool)); - let mut rev_manager = RevisionManager::new(user_id, folder_id.as_ref(), rev_persistence); let cloud = Arc::new(FolderRevisionCloudService { token: token.to_string(), }); - let folder = Arc::new(RwLock::new( - rev_manager - .load::(cloud) - .await?, - )); + let folder = Arc::new(RwLock::new(rev_manager.load::(Some(cloud)).await?)); let rev_manager = Arc::new(rev_manager); let ws_manager = make_folder_ws_manager( user_id, @@ -75,7 +71,7 @@ impl ClientFolderEditor { pub(crate) fn apply_change(&self, change: FolderChange) -> FlowyResult<()> { let FolderChange { delta, md5 } = change; let (base_rev_id, rev_id) = self.rev_manager.next_rev_id_pair(); - let delta_data = delta.to_bytes(); + let delta_data = delta.to_delta_bytes(); let revision = Revision::new( &self.rev_manager.object_id, base_rev_id, @@ -86,7 +82,7 @@ impl ClientFolderEditor { ); let _ = futures::executor::block_on(async { self.rev_manager - .add_local_revision::(&revision) + .add_local_revision(&revision, Box::new(FolderRevisionCompactor())) .await })?; Ok(()) @@ -128,24 +124,10 @@ impl ClientFolderEditor { } } -struct FolderRevisionCompact(); -impl RevisionCompact for FolderRevisionCompact { - fn compact_revisions(user_id: &str, object_id: &str, mut revisions: Vec) -> FlowyResult { - if revisions.is_empty() { - return Err(FlowyError::internal().context("Can't compact the empty folder's revisions")); - } - - if revisions.len() == 1 { - return Ok(revisions.pop().unwrap()); - } - - let first_revision = revisions.first().unwrap(); - let last_revision = revisions.last().unwrap(); - - let (base_rev_id, rev_id) = first_revision.pair_rev_id(); - let md5 = last_revision.md5.clone(); +struct FolderRevisionCompactor(); +impl RevisionCompactor for FolderRevisionCompactor { + fn bytes_from_revisions(&self, revisions: Vec) -> FlowyResult { let delta = make_delta_from_revisions::(revisions)?; - let delta_data = delta.to_bytes(); - Ok(Revision::new(object_id, base_rev_id, rev_id, delta_data, user_id, md5)) + Ok(delta.to_delta_bytes()) } } diff --git a/frontend/rust-lib/flowy-folder/src/services/persistence/migration.rs b/frontend/rust-lib/flowy-folder/src/services/persistence/migration.rs index 3f499fc45f..c08a4c226e 100644 --- a/frontend/rust-lib/flowy-folder/src/services/persistence/migration.rs +++ b/frontend/rust-lib/flowy-folder/src/services/persistence/migration.rs @@ -11,6 +11,7 @@ use flowy_folder_data_model::entities::{ view::{RepeatedView, View}, workspace::Workspace, }; +use flowy_sync::disk::SQLiteTextBlockRevisionPersistence; use flowy_sync::{RevisionLoader, RevisionPersistence}; use std::sync::Arc; @@ -87,7 +88,8 @@ impl FolderMigration { return Ok(None); } let pool = self.database.db_pool()?; - let rev_persistence = Arc::new(RevisionPersistence::new(user_id, folder_id.as_ref(), pool.clone())); + let disk_cache = Arc::new(SQLiteTextBlockRevisionPersistence::new(user_id, pool)); + let rev_persistence = Arc::new(RevisionPersistence::new(user_id, folder_id.as_ref(), disk_cache)); let (revisions, _) = RevisionLoader { object_id: folder_id.as_ref().to_owned(), user_id: self.user_id.clone(), diff --git a/frontend/rust-lib/flowy-folder/src/services/persistence/mod.rs b/frontend/rust-lib/flowy-folder/src/services/persistence/mod.rs index fa473ea063..16417934e0 100644 --- a/frontend/rust-lib/flowy-folder/src/services/persistence/mod.rs +++ b/frontend/rust-lib/flowy-folder/src/services/persistence/mod.rs @@ -2,20 +2,13 @@ mod migration; pub mod version_1; mod version_2; -use flowy_collaboration::client_folder::initial_folder_delta; -use flowy_collaboration::{ - client_folder::FolderPad, - entities::revision::{Revision, RevisionState}, -}; -use std::sync::Arc; -use tokio::sync::RwLock; -pub use version_1::{app_sql::*, trash_sql::*, v1_impl::V1Transaction, view_sql::*, workspace_sql::*}; - use crate::{ event_map::WorkspaceDatabase, manager::FolderId, services::{folder_editor::ClientFolderEditor, persistence::migration::FolderMigration}, }; +use flowy_collaboration::client_folder::initial_folder_delta; +use flowy_collaboration::{client_folder::FolderPad, entities::revision::Revision}; use flowy_error::{FlowyError, FlowyResult}; use flowy_folder_data_model::entities::{ app::App, @@ -23,8 +16,12 @@ use flowy_folder_data_model::entities::{ view::View, workspace::Workspace, }; -use flowy_sync::{mk_revision_disk_cache, RevisionRecord}; +use flowy_sync::disk::{RevisionRecord, RevisionState}; +use flowy_sync::mk_revision_disk_cache; use lib_sqlite::ConnectionPool; +use std::sync::Arc; +use tokio::sync::RwLock; +pub use version_1::{app_sql::*, trash_sql::*, v1_impl::V1Transaction, view_sql::*, workspace_sql::*}; pub trait FolderPersistenceTransaction { fn create_workspace(&self, user_id: &str, workspace: Workspace) -> FlowyResult<()>; @@ -118,7 +115,7 @@ impl FolderPersistence { pub async fn save_folder(&self, user_id: &str, folder_id: &FolderId, folder: FolderPad) -> FlowyResult<()> { let pool = self.database.db_pool()?; - let delta_data = initial_folder_delta(&folder)?.to_bytes(); + let delta_data = initial_folder_delta(&folder)?.to_delta_bytes(); let md5 = folder.md5(); let revision = Revision::new(folder_id.as_ref(), 0, 0, delta_data, user_id, md5); let record = RevisionRecord { diff --git a/frontend/rust-lib/flowy-folder/src/services/persistence/version_1/view_sql.rs b/frontend/rust-lib/flowy-folder/src/services/persistence/version_1/view_sql.rs index c854021b80..a41f3c49c2 100644 --- a/frontend/rust-lib/flowy-folder/src/services/persistence/version_1/view_sql.rs +++ b/frontend/rust-lib/flowy-folder/src/services/persistence/version_1/view_sql.rs @@ -84,7 +84,7 @@ pub(crate) struct ViewTable { impl ViewTable { pub fn new(view: View) -> Self { let data_type = match view.data_type { - ViewDataType::Block => SqlViewDataType::Block, + ViewDataType::TextBlock => SqlViewDataType::Block, ViewDataType::Grid => SqlViewDataType::Grid, }; @@ -106,7 +106,7 @@ impl ViewTable { impl std::convert::From for View { fn from(table: ViewTable) -> Self { let data_type = match table.view_type { - SqlViewDataType::Block => ViewDataType::Block, + SqlViewDataType::Block => ViewDataType::TextBlock, SqlViewDataType::Grid => ViewDataType::Grid, }; diff --git a/frontend/rust-lib/flowy-folder/src/services/view/controller.rs b/frontend/rust-lib/flowy-folder/src/services/view/controller.rs index f09fad218d..c9851d6652 100644 --- a/frontend/rust-lib/flowy-folder/src/services/view/controller.rs +++ b/frontend/rust-lib/flowy-folder/src/services/view/controller.rs @@ -13,10 +13,7 @@ use crate::{ }, }; use bytes::Bytes; -use flowy_collaboration::entities::{ - document_info::BlockId, - revision::{RepeatedRevision, Revision}, -}; +use flowy_collaboration::entities::text_block_info::TextBlockId; use flowy_database::kv::KV; use flowy_folder_data_model::entities::view::ViewDataType; use futures::{FutureExt, StreamExt}; @@ -58,18 +55,19 @@ impl ViewController { #[tracing::instrument(level = "trace", skip(self, params), fields(name = %params.name), err)] pub(crate) async fn create_view_from_params(&self, mut params: CreateViewParams) -> Result { let processor = self.get_data_processor(¶ms.data_type)?; - let content = if params.data.is_empty() { - let default_view_data = processor.default_view_data(¶ms.view_id); - params.data = default_view_data.clone(); - default_view_data + let user_id = self.user.user_id()?; + if params.data.is_empty() { + let view_data = processor.create_default_view(&user_id, ¶ms.view_id).await?; + params.data = view_data.to_vec(); } else { - params.data.clone() + let delta_data = processor + .process_create_view_data(&user_id, ¶ms.view_id, params.data.clone()) + .await?; + let _ = self + .create_view(¶ms.view_id, params.data_type.clone(), delta_data) + .await?; }; - let delta_data = Bytes::from(content); - let _ = self - .create_view(¶ms.view_id, params.data_type.clone(), delta_data) - .await?; let view = self.create_view_on_server(params).await?; let _ = self.create_view_on_local(view.clone()).await?; Ok(view) @@ -86,9 +84,8 @@ impl ViewController { return Err(FlowyError::internal().context("The content of the view should not be empty")); } let user_id = self.user.user_id()?; - let repeated_revision: RepeatedRevision = Revision::initial_revision(&user_id, view_id, delta_data).into(); let processor = self.get_data_processor(&data_type)?; - let _ = processor.create_container(view_id, repeated_revision).await?; + let _ = processor.create_container(&user_id, view_id, delta_data).await?; Ok(()) } @@ -147,7 +144,7 @@ impl ViewController { } #[tracing::instrument(level = "debug", skip(self,params), fields(doc_id = %params.value), err)] - pub(crate) async fn delete_view(&self, params: BlockId) -> Result<(), FlowyError> { + pub(crate) async fn delete_view(&self, params: TextBlockId) -> Result<(), FlowyError> { if let Some(view_id) = KV::get_str(LATEST_VIEW_ID) { if view_id == params.value { let _ = KV::remove(LATEST_VIEW_ID); @@ -166,16 +163,15 @@ impl ViewController { .await?; let processor = self.get_data_processor(&view.data_type)?; - let delta_str = processor.delta_str(view_id).await?; + let delta_bytes = processor.delta_bytes(view_id).await?; let duplicate_params = CreateViewParams { belong_to_id: view.belong_to_id.clone(), name: format!("{} (copy)", &view.name), desc: view.desc, thumbnail: view.thumbnail, data_type: view.data_type, - data: delta_str, + data: delta_bytes.to_vec(), view_id: uuid(), - ext_data: view.ext_data, plugin_type: view.plugin_type, }; diff --git a/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs b/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs index 18a11d9a0b..9f9bae4a82 100644 --- a/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs +++ b/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs @@ -1,6 +1,8 @@ use crate::script::{invalid_workspace_name_test_case, FolderScript::*, FolderTest}; -use flowy_collaboration::{client_document::default::initial_quill_delta_string, entities::revision::RevisionState}; + use flowy_folder::entities::workspace::CreateWorkspacePayload; +use flowy_folder_data_model::entities::view::ViewDataType; +use flowy_sync::disk::RevisionState; use flowy_test::{event_builder::*, FlowySDKTest}; #[tokio::test] @@ -135,10 +137,12 @@ async fn app_create_with_view() { CreateView { name: "View A".to_owned(), desc: "View A description".to_owned(), + data_type: ViewDataType::TextBlock, }, CreateView { - name: "View B".to_owned(), - desc: "View B description".to_owned(), + name: "Grid".to_owned(), + desc: "Grid description".to_owned(), + data_type: ViewDataType::Grid, }, ReadApp(app.id), ]) @@ -147,7 +151,7 @@ async fn app_create_with_view() { app = test.app.clone(); assert_eq!(app.belongings.len(), 3); assert_eq!(app.belongings[1].name, "View A"); - assert_eq!(app.belongings[2].name, "View B") + assert_eq!(app.belongings[2].name, "Grid") } #[tokio::test] @@ -168,16 +172,6 @@ async fn view_update() { assert_eq!(test.view.name, new_name); } -#[tokio::test] -async fn open_document_view() { - let mut test = FolderTest::new().await; - assert_eq!(test.document_info, None); - - test.run_scripts(vec![OpenDocument]).await; - let document_info = test.document_info.unwrap(); - assert_eq!(document_info.text, initial_quill_delta_string()); -} - #[tokio::test] #[should_panic] async fn view_delete() { @@ -207,10 +201,12 @@ async fn view_delete_all() { CreateView { name: "View A".to_owned(), desc: "View A description".to_owned(), + data_type: ViewDataType::TextBlock, }, CreateView { - name: "View B".to_owned(), - desc: "View B description".to_owned(), + name: "Grid".to_owned(), + desc: "Grid description".to_owned(), + data_type: ViewDataType::Grid, }, ReadApp(app.id.clone()), ]) @@ -238,6 +234,7 @@ async fn view_delete_all_permanent() { CreateView { name: "View A".to_owned(), desc: "View A description".to_owned(), + data_type: ViewDataType::TextBlock, }, ReadApp(app.id.clone()), ]) @@ -336,6 +333,7 @@ async fn folder_sync_revision_with_new_view() { CreateView { name: view_name.clone(), desc: view_desc.clone(), + data_type: ViewDataType::TextBlock, }, AssertCurrentRevId(3), AssertNextSyncRevId(Some(3)), diff --git a/frontend/rust-lib/flowy-folder/tests/workspace/helper.rs b/frontend/rust-lib/flowy-folder/tests/workspace/helper.rs deleted file mode 100644 index f0e1107535..0000000000 --- a/frontend/rust-lib/flowy-folder/tests/workspace/helper.rs +++ /dev/null @@ -1,211 +0,0 @@ -use flowy_collaboration::entities::document_info::BlockInfo; -use flowy_folder::event_map::FolderEvent::*; -use flowy_folder_data_model::entities::view::{RepeatedViewId, ViewId}; -use flowy_folder_data_model::entities::workspace::WorkspaceId; -use flowy_folder_data_model::entities::{ - app::{App, AppId, CreateAppPayload, UpdateAppPayload}, - trash::{RepeatedTrash, TrashId, TrashType}, - view::{CreateViewPayload, UpdateViewPayload, View, ViewDataType}, - workspace::{CreateWorkspacePayload, RepeatedWorkspace, Workspace}, -}; -use flowy_test::{event_builder::*, FlowySDKTest}; - -pub async fn create_workspace(sdk: &FlowySDKTest, name: &str, desc: &str) -> Workspace { - let request = CreateWorkspacePayload { - name: name.to_owned(), - desc: desc.to_owned(), - }; - - let workspace = FolderEventBuilder::new(sdk.clone()) - .event(CreateWorkspace) - .payload(request) - .async_send() - .await - .parse::(); - workspace -} - -pub async fn read_workspace(sdk: &FlowySDKTest, workspace_id: Option) -> Vec { - let request = WorkspaceId { value: workspace_id }; - let repeated_workspace = FolderEventBuilder::new(sdk.clone()) - .event(ReadWorkspaces) - .payload(request.clone()) - .async_send() - .await - .parse::(); - - let workspaces; - if let Some(workspace_id) = &request.value { - workspaces = repeated_workspace - .into_inner() - .into_iter() - .filter(|workspace| &workspace.id == workspace_id) - .collect::>(); - debug_assert_eq!(workspaces.len(), 1); - } else { - workspaces = repeated_workspace.items; - } - - workspaces -} - -pub async fn create_app(sdk: &FlowySDKTest, workspace_id: &str, name: &str, desc: &str) -> App { - let create_app_request = CreateAppPayload { - workspace_id: workspace_id.to_owned(), - name: name.to_string(), - desc: desc.to_string(), - color_style: Default::default(), - }; - - let app = FolderEventBuilder::new(sdk.clone()) - .event(CreateApp) - .payload(create_app_request) - .async_send() - .await - .parse::(); - app -} - -pub async fn read_app(sdk: &FlowySDKTest, app_id: &str) -> App { - let request = AppId { - value: app_id.to_owned(), - }; - - let app = FolderEventBuilder::new(sdk.clone()) - .event(ReadApp) - .payload(request) - .async_send() - .await - .parse::(); - - app -} - -pub async fn update_app(sdk: &FlowySDKTest, app_id: &str, name: Option, desc: Option) { - let request = UpdateAppPayload { - app_id: app_id.to_string(), - name, - desc, - color_style: None, - is_trash: None, - }; - - FolderEventBuilder::new(sdk.clone()) - .event(UpdateApp) - .payload(request) - .async_send() - .await; -} - -pub async fn delete_app(sdk: &FlowySDKTest, app_id: &str) { - let request = AppId { - value: app_id.to_string(), - }; - - FolderEventBuilder::new(sdk.clone()) - .event(DeleteApp) - .payload(request) - .async_send() - .await; -} - -pub async fn create_view(sdk: &FlowySDKTest, app_id: &str, name: &str, desc: &str, data_type: ViewDataType) -> View { - let request = CreateViewPayload { - belong_to_id: app_id.to_string(), - name: name.to_string(), - desc: desc.to_string(), - thumbnail: None, - data_type, - ext_data: "".to_string(), - plugin_type: 0, - }; - let view = FolderEventBuilder::new(sdk.clone()) - .event(CreateView) - .payload(request) - .async_send() - .await - .parse::(); - view -} - -pub async fn read_view(sdk: &FlowySDKTest, view_id: &str) -> View { - let view_id: ViewId = view_id.into(); - FolderEventBuilder::new(sdk.clone()) - .event(ReadView) - .payload(view_id) - .async_send() - .await - .parse::() -} - -pub async fn update_view(sdk: &FlowySDKTest, view_id: &str, name: Option, desc: Option) { - let request = UpdateViewPayload { - view_id: view_id.to_string(), - name, - desc, - thumbnail: None, - }; - FolderEventBuilder::new(sdk.clone()) - .event(UpdateView) - .payload(request) - .async_send() - .await; -} - -pub async fn delete_view(sdk: &FlowySDKTest, view_ids: Vec) { - let request = RepeatedViewId { items: view_ids }; - FolderEventBuilder::new(sdk.clone()) - .event(DeleteView) - .payload(request) - .async_send() - .await; -} - -pub async fn open_document(sdk: &FlowySDKTest, view_id: &str) -> BlockInfo { - let view_id: ViewId = view_id.into(); - FolderEventBuilder::new(sdk.clone()) - .event(SetLatestView) - .payload(view_id) - .async_send() - .await - .parse::() -} - -pub async fn read_trash(sdk: &FlowySDKTest) -> RepeatedTrash { - FolderEventBuilder::new(sdk.clone()) - .event(ReadTrash) - .async_send() - .await - .parse::() -} - -pub async fn restore_app_from_trash(sdk: &FlowySDKTest, app_id: &str) { - let id = TrashId { - id: app_id.to_owned(), - ty: TrashType::TrashApp, - }; - FolderEventBuilder::new(sdk.clone()) - .event(PutbackTrash) - .payload(id) - .async_send() - .await; -} - -pub async fn restore_view_from_trash(sdk: &FlowySDKTest, view_id: &str) { - let id = TrashId { - id: view_id.to_owned(), - ty: TrashType::TrashView, - }; - FolderEventBuilder::new(sdk.clone()) - .event(PutbackTrash) - .payload(id) - .async_send() - .await; -} - -pub async fn delete_all_trash(sdk: &FlowySDKTest) { - FolderEventBuilder::new(sdk.clone()) - .event(DeleteAllTrash) - .async_send() - .await; -} diff --git a/frontend/rust-lib/flowy-folder/tests/workspace/main.rs b/frontend/rust-lib/flowy-folder/tests/workspace/main.rs index 553449ee4b..ff48b349e1 100644 --- a/frontend/rust-lib/flowy-folder/tests/workspace/main.rs +++ b/frontend/rust-lib/flowy-folder/tests/workspace/main.rs @@ -1,3 +1,2 @@ mod folder_test; -mod helper; mod script; diff --git a/frontend/rust-lib/flowy-folder/tests/workspace/script.rs b/frontend/rust-lib/flowy-folder/tests/workspace/script.rs index bc3418f441..e476c36f2d 100644 --- a/frontend/rust-lib/flowy-folder/tests/workspace/script.rs +++ b/frontend/rust-lib/flowy-folder/tests/workspace/script.rs @@ -1,38 +1,63 @@ -use crate::helper::*; -use flowy_collaboration::entities::{document_info::BlockInfo, revision::RevisionState}; +use flowy_collaboration::entities::text_block_info::TextBlockInfo; +use flowy_folder::event_map::FolderEvent::*; use flowy_folder::{errors::ErrorCode, services::folder_editor::ClientFolderEditor}; +use flowy_folder_data_model::entities::view::{RepeatedViewId, ViewId}; +use flowy_folder_data_model::entities::workspace::WorkspaceId; use flowy_folder_data_model::entities::{ app::{App, RepeatedApp}, trash::Trash, view::{RepeatedView, View, ViewDataType}, workspace::Workspace, }; +use flowy_folder_data_model::entities::{ + app::{AppId, CreateAppPayload, UpdateAppPayload}, + trash::{RepeatedTrash, TrashId, TrashType}, + view::{CreateViewPayload, UpdateViewPayload}, + workspace::{CreateWorkspacePayload, RepeatedWorkspace}, +}; +use flowy_sync::disk::RevisionState; use flowy_sync::REVISION_WRITE_INTERVAL_IN_MILLIS; -use flowy_test::FlowySDKTest; +use flowy_test::{event_builder::*, FlowySDKTest}; use std::{sync::Arc, time::Duration}; use tokio::time::sleep; pub enum FolderScript { // Workspace ReadAllWorkspaces, - CreateWorkspace { name: String, desc: String }, + CreateWorkspace { + name: String, + desc: String, + }, AssertWorkspaceJson(String), AssertWorkspace(Workspace), ReadWorkspace(Option), // App - CreateApp { name: String, desc: String }, + CreateApp { + name: String, + desc: String, + }, AssertAppJson(String), AssertApp(App), ReadApp(String), - UpdateApp { name: Option, desc: Option }, + UpdateApp { + name: Option, + desc: Option, + }, DeleteApp, // View - CreateView { name: String, desc: String }, + CreateView { + name: String, + desc: String, + data_type: ViewDataType, + }, AssertView(View), ReadView(String), - UpdateView { name: Option, desc: Option }, + UpdateView { + name: Option, + desc: Option, + }, DeleteView, DeleteViews(Vec), @@ -42,13 +67,13 @@ pub enum FolderScript { ReadTrash, DeleteAllTrash, - // Document - OpenDocument, - // Sync AssertCurrentRevId(i64), AssertNextSyncRevId(Option), - AssertRevisionState { rev_id: i64, state: RevisionState }, + AssertRevisionState { + rev_id: i64, + state: RevisionState, + }, } pub struct FolderTest { @@ -58,7 +83,6 @@ pub struct FolderTest { pub app: App, pub view: View, pub trash: Vec, - pub document_info: Option, // pub folder_editor: } @@ -68,7 +92,14 @@ impl FolderTest { let _ = sdk.init_user().await; let mut workspace = create_workspace(&sdk, "FolderWorkspace", "Folder test workspace").await; let mut app = create_app(&sdk, &workspace.id, "Folder App", "Folder test app").await; - let view = create_view(&sdk, &app.id, "Folder View", "Folder test view", ViewDataType::Block).await; + let view = create_view( + &sdk, + &app.id, + "Folder View", + "Folder test view", + ViewDataType::TextBlock, + ) + .await; app.belongings = RepeatedView { items: vec![view.clone()], }; @@ -83,7 +114,6 @@ impl FolderTest { app, view, trash: vec![], - document_info: None, } } @@ -145,8 +175,8 @@ impl FolderTest { delete_app(sdk, &self.app.id).await; } - FolderScript::CreateView { name, desc } => { - let view = create_view(sdk, &self.app.id, &name, &desc, ViewDataType::Block).await; + FolderScript::CreateView { name, desc, data_type } => { + let view = create_view(sdk, &self.app.id, &name, &desc, data_type).await; self.view = view; } FolderScript::AssertView(view) => { @@ -179,10 +209,6 @@ impl FolderTest { delete_all_trash(sdk).await; self.trash = vec![]; } - FolderScript::OpenDocument => { - let document_info = open_document(sdk, &self.view.id).await; - self.document_info = Some(document_info); - } FolderScript::AssertRevisionState { rev_id, state } => { let record = cache.get(rev_id).await.unwrap(); assert_eq!(record.state, state); @@ -217,3 +243,204 @@ pub fn invalid_workspace_name_test_case() -> Vec<(String, ErrorCode)> { ("1234".repeat(100), ErrorCode::WorkspaceNameTooLong), ] } + +pub async fn create_workspace(sdk: &FlowySDKTest, name: &str, desc: &str) -> Workspace { + let request = CreateWorkspacePayload { + name: name.to_owned(), + desc: desc.to_owned(), + }; + + let workspace = FolderEventBuilder::new(sdk.clone()) + .event(CreateWorkspace) + .payload(request) + .async_send() + .await + .parse::(); + workspace +} + +pub async fn read_workspace(sdk: &FlowySDKTest, workspace_id: Option) -> Vec { + let request = WorkspaceId { value: workspace_id }; + let repeated_workspace = FolderEventBuilder::new(sdk.clone()) + .event(ReadWorkspaces) + .payload(request.clone()) + .async_send() + .await + .parse::(); + + let workspaces; + if let Some(workspace_id) = &request.value { + workspaces = repeated_workspace + .into_inner() + .into_iter() + .filter(|workspace| &workspace.id == workspace_id) + .collect::>(); + debug_assert_eq!(workspaces.len(), 1); + } else { + workspaces = repeated_workspace.items; + } + + workspaces +} + +pub async fn create_app(sdk: &FlowySDKTest, workspace_id: &str, name: &str, desc: &str) -> App { + let create_app_request = CreateAppPayload { + workspace_id: workspace_id.to_owned(), + name: name.to_string(), + desc: desc.to_string(), + color_style: Default::default(), + }; + + let app = FolderEventBuilder::new(sdk.clone()) + .event(CreateApp) + .payload(create_app_request) + .async_send() + .await + .parse::(); + app +} + +pub async fn read_app(sdk: &FlowySDKTest, app_id: &str) -> App { + let request = AppId { + value: app_id.to_owned(), + }; + + let app = FolderEventBuilder::new(sdk.clone()) + .event(ReadApp) + .payload(request) + .async_send() + .await + .parse::(); + + app +} + +pub async fn update_app(sdk: &FlowySDKTest, app_id: &str, name: Option, desc: Option) { + let request = UpdateAppPayload { + app_id: app_id.to_string(), + name, + desc, + color_style: None, + is_trash: None, + }; + + FolderEventBuilder::new(sdk.clone()) + .event(UpdateApp) + .payload(request) + .async_send() + .await; +} + +pub async fn delete_app(sdk: &FlowySDKTest, app_id: &str) { + let request = AppId { + value: app_id.to_string(), + }; + + FolderEventBuilder::new(sdk.clone()) + .event(DeleteApp) + .payload(request) + .async_send() + .await; +} + +pub async fn create_view(sdk: &FlowySDKTest, app_id: &str, name: &str, desc: &str, data_type: ViewDataType) -> View { + let request = CreateViewPayload { + belong_to_id: app_id.to_string(), + name: name.to_string(), + desc: desc.to_string(), + thumbnail: None, + data_type, + plugin_type: 0, + data: vec![], + }; + let view = FolderEventBuilder::new(sdk.clone()) + .event(CreateView) + .payload(request) + .async_send() + .await + .parse::(); + view +} + +pub async fn read_view(sdk: &FlowySDKTest, view_id: &str) -> View { + let view_id: ViewId = view_id.into(); + FolderEventBuilder::new(sdk.clone()) + .event(ReadView) + .payload(view_id) + .async_send() + .await + .parse::() +} + +pub async fn update_view(sdk: &FlowySDKTest, view_id: &str, name: Option, desc: Option) { + let request = UpdateViewPayload { + view_id: view_id.to_string(), + name, + desc, + thumbnail: None, + }; + FolderEventBuilder::new(sdk.clone()) + .event(UpdateView) + .payload(request) + .async_send() + .await; +} + +pub async fn delete_view(sdk: &FlowySDKTest, view_ids: Vec) { + let request = RepeatedViewId { items: view_ids }; + FolderEventBuilder::new(sdk.clone()) + .event(DeleteView) + .payload(request) + .async_send() + .await; +} + +#[allow(dead_code)] +pub async fn set_latest_view(sdk: &FlowySDKTest, view_id: &str) -> TextBlockInfo { + let view_id: ViewId = view_id.into(); + FolderEventBuilder::new(sdk.clone()) + .event(SetLatestView) + .payload(view_id) + .async_send() + .await + .parse::() +} + +pub async fn read_trash(sdk: &FlowySDKTest) -> RepeatedTrash { + FolderEventBuilder::new(sdk.clone()) + .event(ReadTrash) + .async_send() + .await + .parse::() +} + +pub async fn restore_app_from_trash(sdk: &FlowySDKTest, app_id: &str) { + let id = TrashId { + id: app_id.to_owned(), + ty: TrashType::TrashApp, + }; + FolderEventBuilder::new(sdk.clone()) + .event(PutbackTrash) + .payload(id) + .async_send() + .await; +} + +pub async fn restore_view_from_trash(sdk: &FlowySDKTest, view_id: &str) { + let id = TrashId { + id: view_id.to_owned(), + ty: TrashType::TrashView, + }; + FolderEventBuilder::new(sdk.clone()) + .event(PutbackTrash) + .payload(id) + .async_send() + .await; +} + +pub async fn delete_all_trash(sdk: &FlowySDKTest) { + FolderEventBuilder::new(sdk.clone()) + .event(DeleteAllTrash) + .async_send() + .await; +} diff --git a/frontend/rust-lib/flowy-grid/Cargo.toml b/frontend/rust-lib/flowy-grid/Cargo.toml index 95a5899f5e..fda64c7f66 100644 --- a/frontend/rust-lib/flowy-grid/Cargo.toml +++ b/frontend/rust-lib/flowy-grid/Cargo.toml @@ -33,6 +33,12 @@ dashmap = "4.0" tokio = {version = "1", features = ["sync"]} rayon = "1.5" parking_lot = "0.11" +serde = { version = "1.0", features = ["derive"] } +serde_json = {version = "1.0"} + +[dev-dependencies] +flowy-test = { path = "../flowy-test" } +flowy-grid = { path = "../flowy-grid", features = ["flowy_unit_test"]} [build-dependencies] lib-infra = { path = "../../../shared-lib/lib-infra", features = ["protobuf_file_gen", "proto_gen"] } @@ -40,4 +46,5 @@ lib-infra = { path = "../../../shared-lib/lib-infra", features = ["protobuf_file [features] default = [] -dart = ["lib-infra/dart"] \ No newline at end of file +dart = ["lib-infra/dart"] +flowy_unit_test = ["flowy-sync/flowy_unit_test"] \ No newline at end of file diff --git a/frontend/rust-lib/flowy-grid/Flowy.toml b/frontend/rust-lib/flowy-grid/Flowy.toml index d7c3d8260d..b310e3fcd7 100644 --- a/frontend/rust-lib/flowy-grid/Flowy.toml +++ b/frontend/rust-lib/flowy-grid/Flowy.toml @@ -1,3 +1,3 @@ -proto_crates = ["src/event_map.rs", "src/services/cell_data.rs"] +proto_crates = ["src/event_map.rs", "src/services/cell/description", "src/dart_notification.rs"] event_files = ["src/event_map.rs"] \ No newline at end of file diff --git a/frontend/rust-lib/flowy-grid/src/dart_notification.rs b/frontend/rust-lib/flowy-grid/src/dart_notification.rs new file mode 100644 index 0000000000..82ab35bdee --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/dart_notification.rs @@ -0,0 +1,35 @@ +use dart_notify::DartNotifyBuilder; +use flowy_derive::ProtoBuf_Enum; +const OBSERVABLE_CATEGORY: &str = "Grid"; + +#[derive(ProtoBuf_Enum, Debug)] +pub enum GridNotification { + Unknown = 0, + GridDidUpdateBlock = 10, + GridDidCreateBlock = 11, + + GridDidUpdateCells = 20, + GridDidUpdateFields = 30, +} + +impl std::default::Default for GridNotification { + fn default() -> Self { + GridNotification::Unknown + } +} + +impl std::convert::From for i32 { + fn from(notification: GridNotification) -> Self { + notification as i32 + } +} + +#[tracing::instrument(level = "trace")] +pub fn send_dart_notification(id: &str, ty: GridNotification) -> DartNotifyBuilder { + DartNotifyBuilder::new(id, ty, OBSERVABLE_CATEGORY) +} + +#[tracing::instrument(level = "trace")] +pub fn send_anonymous_dart_notification(ty: GridNotification) -> DartNotifyBuilder { + DartNotifyBuilder::new("", ty, OBSERVABLE_CATEGORY) +} diff --git a/frontend/rust-lib/flowy-grid/src/event_handler.rs b/frontend/rust-lib/flowy-grid/src/event_handler.rs index eb17b1f35e..73aed6da43 100644 --- a/frontend/rust-lib/flowy-grid/src/event_handler.rs +++ b/frontend/rust-lib/flowy-grid/src/event_handler.rs @@ -1,6 +1,10 @@ use crate::manager::GridManager; use flowy_error::FlowyError; -use flowy_grid_data_model::entities::{Grid, GridId, QueryFieldPayload, QueryRowPayload, RepeatedField, RepeatedRow}; +use flowy_grid_data_model::entities::{ + CellMetaChangeset, CreateRowPayload, Field, Grid, GridId, QueryFieldPayload, QueryGridBlocksPayload, + QueryRowPayload, RepeatedField, RepeatedGridBlock, Row, +}; +use flowy_grid_data_model::parser::{CreateRowParams, QueryFieldParams, QueryGridBlocksParams, QueryRowParams}; use lib_dispatch::prelude::{data_result, AppData, Data, DataResult}; use std::sync::Arc; @@ -11,19 +15,37 @@ pub(crate) async fn get_grid_data_handler( ) -> DataResult { let grid_id: GridId = data.into_inner(); let editor = manager.open_grid(grid_id).await?; - let grid = editor.grid_data().await; + let grid = editor.grid_data().await?; data_result(grid) } #[tracing::instrument(level = "debug", skip(data, manager), err)] -pub(crate) async fn get_rows_handler( +pub(crate) async fn get_grid_blocks_handler( + data: Data, + manager: AppData>, +) -> DataResult { + let params: QueryGridBlocksParams = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(¶ms.grid_id)?; + let block_ids = params + .block_orders + .into_iter() + .map(|block| block.block_id) + .collect::>(); + let repeated_grid_block = editor.get_blocks(Some(block_ids)).await?; + data_result(repeated_grid_block) +} + +#[tracing::instrument(level = "debug", skip(data, manager), err)] +pub(crate) async fn get_row_handler( data: Data, manager: AppData>, -) -> DataResult { - let payload: QueryRowPayload = data.into_inner(); - let editor = manager.get_grid_editor(&payload.grid_id)?; - let repeated_row = editor.get_rows(payload.row_orders).await?; - data_result(repeated_row) +) -> DataResult { + let params: QueryRowParams = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(¶ms.grid_id)?; + match editor.get_row(¶ms.block_id, ¶ms.row_id).await? { + None => Err(FlowyError::record_not_found().context("Can not find the row")), + Some(row) => data_result(row), + } } #[tracing::instrument(level = "debug", skip(data, manager), err)] @@ -31,19 +53,31 @@ pub(crate) async fn get_fields_handler( data: Data, manager: AppData>, ) -> DataResult { - let payload: QueryFieldPayload = data.into_inner(); - let editor = manager.get_grid_editor(&payload.grid_id)?; - let repeated_field = editor.get_fields(payload.field_orders).await?; + let params: QueryFieldParams = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(¶ms.grid_id)?; + let field_metas = editor.get_field_metas(Some(params.field_orders)).await?; + let repeated_field: RepeatedField = field_metas.into_iter().map(Field::from).collect::>().into(); data_result(repeated_field) } #[tracing::instrument(level = "debug", skip(data, manager), err)] pub(crate) async fn create_row_handler( - data: Data, + data: Data, manager: AppData>, ) -> Result<(), FlowyError> { - let id: GridId = data.into_inner(); - let editor = manager.get_grid_editor(id.as_ref())?; - let _ = editor.create_empty_row().await?; + let params: CreateRowParams = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(params.grid_id.as_ref())?; + let _ = editor.create_row(params.start_row_id).await?; + Ok(()) +} + +#[tracing::instrument(level = "debug", skip_all, err)] +pub(crate) async fn update_cell_handler( + data: Data, + manager: AppData>, +) -> Result<(), FlowyError> { + let changeset: CellMetaChangeset = data.into_inner(); + let editor = manager.get_grid_editor(&changeset.grid_id)?; + let _ = editor.update_cell(changeset).await?; Ok(()) } diff --git a/frontend/rust-lib/flowy-grid/src/event_map.rs b/frontend/rust-lib/flowy-grid/src/event_map.rs index f171e27826..03b27f4c70 100644 --- a/frontend/rust-lib/flowy-grid/src/event_map.rs +++ b/frontend/rust-lib/flowy-grid/src/event_map.rs @@ -9,9 +9,11 @@ pub fn create(grid_manager: Arc) -> Module { let mut module = Module::new().name(env!("CARGO_PKG_NAME")).data(grid_manager); module = module .event(GridEvent::GetGridData, get_grid_data_handler) - .event(GridEvent::GetRows, get_rows_handler) + .event(GridEvent::GetGridBlocks, get_grid_blocks_handler) .event(GridEvent::GetFields, get_fields_handler) - .event(GridEvent::CreateRow, create_row_handler); + .event(GridEvent::CreateRow, create_row_handler) + .event(GridEvent::GetRow, get_row_handler) + .event(GridEvent::UpdateCell, update_cell_handler); module } @@ -22,12 +24,18 @@ pub enum GridEvent { #[event(input = "GridId", output = "Grid")] GetGridData = 0, - #[event(input = "QueryRowPayload", output = "RepeatedRow")] - GetRows = 1, + #[event(input = "QueryGridBlocksPayload", output = "RepeatedGridBlock")] + GetGridBlocks = 1, #[event(input = "QueryFieldPayload", output = "RepeatedField")] - GetFields = 2, + GetFields = 10, - #[event(input = "GridId")] - CreateRow = 3, + #[event(input = "CreateRowPayload", output = "Row")] + CreateRow = 11, + + #[event(input = "QueryRowPayload", output = "Row")] + GetRow = 12, + + #[event(input = "CellMetaChangeset")] + UpdateCell = 20, } diff --git a/frontend/rust-lib/flowy-grid/src/lib.rs b/frontend/rust-lib/flowy-grid/src/lib.rs index 262fe1d1c2..a3ac3411e2 100644 --- a/frontend/rust-lib/flowy-grid/src/lib.rs +++ b/frontend/rust-lib/flowy-grid/src/lib.rs @@ -5,5 +5,7 @@ mod event_handler; pub mod event_map; pub mod manager; +mod dart_notification; mod protobuf; pub mod services; +pub mod util; diff --git a/frontend/rust-lib/flowy-grid/src/macros.rs b/frontend/rust-lib/flowy-grid/src/macros.rs index 043dcccb44..d7a5fc8bf8 100644 --- a/frontend/rust-lib/flowy-grid/src/macros.rs +++ b/frontend/rust-lib/flowy-grid/src/macros.rs @@ -1,29 +1,17 @@ #[macro_export] -macro_rules! impl_any_data { +macro_rules! impl_from_and_to_type_option { ($target: ident, $field_type:expr) => { - impl_field_type_data_from_field!($target); - impl_field_type_data_from_field_type_option!($target); - impl_type_option_from_field_data!($target, $field_type); + impl_from_field_type_option!($target); + impl_to_field_type_option!($target, $field_type); }; } #[macro_export] -macro_rules! impl_field_type_data_from_field { +macro_rules! impl_from_field_type_option { ($target: ident) => { - impl std::convert::From<&Field> for $target { - fn from(field: &Field) -> $target { - $target::from(&field.type_options) - } - } - }; -} - -#[macro_export] -macro_rules! impl_field_type_data_from_field_type_option { - ($target: ident) => { - impl std::convert::From<&AnyData> for $target { - fn from(any_data: &AnyData) -> $target { - match $target::try_from(Bytes::from(any_data.value.clone())) { + impl std::convert::From<&FieldMeta> for $target { + fn from(field_meta: &FieldMeta) -> $target { + match serde_json::from_str(&field_meta.type_options) { Ok(obj) => obj, Err(err) => { tracing::error!("{} convert from any data failed, {:?}", stringify!($target), err); @@ -36,26 +24,21 @@ macro_rules! impl_field_type_data_from_field_type_option { } #[macro_export] -macro_rules! impl_type_option_from_field_data { +macro_rules! impl_to_field_type_option { ($target: ident, $field_type:expr) => { impl $target { - pub fn field_type() -> FieldType { + pub fn field_type(&self) -> FieldType { $field_type } } - impl std::convert::From<$target> for AnyData { - fn from(field_data: $target) -> Self { - match field_data.try_into() { - Ok(bytes) => { - let bytes: Bytes = bytes; - AnyData::from_bytes(&$target::field_type(), bytes) - } + impl std::convert::From<$target> for String { + fn from(field_description: $target) -> Self { + match serde_json::to_string(&field_description) { + Ok(s) => s, Err(e) => { tracing::error!("Field type data convert to AnyData fail, error: {:?}", e); - // it's impossible to fail when unwrapping the default field type data - let default_bytes: Bytes = $target::default().try_into().unwrap(); - AnyData::from_bytes(&$target::field_type(), default_bytes) + serde_json::to_string(&$target::default()).unwrap() } } } diff --git a/frontend/rust-lib/flowy-grid/src/manager.rs b/frontend/rust-lib/flowy-grid/src/manager.rs index 95eea5b9cc..104f74d5f4 100644 --- a/frontend/rust-lib/flowy-grid/src/manager.rs +++ b/frontend/rust-lib/flowy-grid/src/manager.rs @@ -1,12 +1,13 @@ use crate::services::grid_editor::ClientGridEditor; -use crate::services::kv_persistence::{GridKVPersistence, KVTransaction}; +use crate::services::kv_persistence::GridKVPersistence; +use bytes::Bytes; use dashmap::DashMap; - -use flowy_collaboration::entities::revision::RepeatedRevision; +use flowy_collaboration::client_grid::{make_block_meta_delta, make_grid_delta}; +use flowy_collaboration::entities::revision::{RepeatedRevision, Revision}; use flowy_error::{FlowyError, FlowyResult}; -use flowy_grid_data_model::entities::{Field, RawRow}; +use flowy_grid_data_model::entities::{BuildGridContext, GridMeta}; +use flowy_sync::disk::{SQLiteGridBlockMetaRevisionPersistence, SQLiteGridRevisionPersistence}; use flowy_sync::{RevisionManager, RevisionPersistence, RevisionWebSocket}; - use lib_sqlite::ConnectionPool; use parking_lot::RwLock; use std::sync::Arc; @@ -46,6 +47,19 @@ impl GridManager { Ok(()) } + #[tracing::instrument(level = "debug", skip_all, err)] + pub async fn create_grid_block_meta>( + &self, + block_id: T, + revisions: RepeatedRevision, + ) -> FlowyResult<()> { + let block_id = block_id.as_ref(); + let db_pool = self.grid_user.db_pool()?; + let rev_manager = self.make_grid_block_meta_rev_manager(block_id, db_pool)?; + let _ = rev_manager.reset_object(revisions).await?; + Ok(()) + } + #[tracing::instrument(level = "debug", skip_all, fields(grid_id), err)] pub async fn open_grid>(&self, grid_id: T) -> FlowyResult> { let grid_id = grid_id.as_ref(); @@ -77,18 +91,6 @@ impl GridManager { } } - pub fn save_rows(&self, rows: Vec) -> FlowyResult<()> { - let kv_persistence = self.get_kv_persistence()?; - let _ = kv_persistence.batch_set(rows)?; - Ok(()) - } - - pub fn save_fields(&self, fields: Vec) -> FlowyResult<()> { - let kv_persistence = self.get_kv_persistence()?; - let _ = kv_persistence.batch_set(fields)?; - Ok(()) - } - async fn get_or_create_grid_editor(&self, grid_id: &str) -> FlowyResult> { match self.editor_map.get(grid_id) { None => { @@ -109,18 +111,32 @@ impl GridManager { ) -> Result, FlowyError> { let user = self.grid_user.clone(); let rev_manager = self.make_grid_rev_manager(grid_id, pool.clone())?; - let kv_persistence = self.get_kv_persistence()?; - let grid_editor = ClientGridEditor::new(grid_id, user, rev_manager, kv_persistence).await?; + let grid_editor = ClientGridEditor::new(grid_id, user, rev_manager).await?; Ok(grid_editor) } - fn make_grid_rev_manager(&self, grid_id: &str, pool: Arc) -> FlowyResult { + pub fn make_grid_rev_manager(&self, grid_id: &str, pool: Arc) -> FlowyResult { let user_id = self.grid_user.user_id()?; - let rev_persistence = Arc::new(RevisionPersistence::new(&user_id, grid_id, pool)); + + let disk_cache = Arc::new(SQLiteGridRevisionPersistence::new(&user_id, pool)); + let rev_persistence = Arc::new(RevisionPersistence::new(&user_id, grid_id, disk_cache)); let rev_manager = RevisionManager::new(&user_id, grid_id, rev_persistence); Ok(rev_manager) } + fn make_grid_block_meta_rev_manager( + &self, + block_d: &str, + pool: Arc, + ) -> FlowyResult { + let user_id = self.grid_user.user_id()?; + let disk_cache = Arc::new(SQLiteGridBlockMetaRevisionPersistence::new(&user_id, pool)); + let rev_persistence = Arc::new(RevisionPersistence::new(&user_id, block_d, disk_cache)); + let rev_manager = RevisionManager::new(&user_id, block_d, rev_persistence); + Ok(rev_manager) + } + + #[allow(dead_code)] fn get_kv_persistence(&self) -> FlowyResult> { let read_guard = self.kv_persistence.read(); if read_guard.is_some() { @@ -159,3 +175,33 @@ impl GridEditorMap { self.inner.remove(grid_id); } } + +pub async fn make_grid_view_data( + user_id: &str, + view_id: &str, + grid_manager: Arc, + build_context: BuildGridContext, +) -> FlowyResult { + let block_id = build_context.block_metas.block_id.clone(); + let grid_meta = GridMeta { + grid_id: view_id.to_string(), + fields: build_context.field_metas, + block_metas: vec![build_context.block_metas], + }; + + let grid_meta_delta = make_grid_delta(&grid_meta); + let grid_delta_data = grid_meta_delta.to_delta_bytes(); + let repeated_revision: RepeatedRevision = + Revision::initial_revision(user_id, view_id, grid_delta_data.clone()).into(); + let _ = grid_manager.create_grid(view_id, repeated_revision).await?; + + let grid_block_meta_delta = make_block_meta_delta(&build_context.block_meta_data); + let block_meta_delta_data = grid_block_meta_delta.to_delta_bytes(); + let repeated_revision: RepeatedRevision = + Revision::initial_revision(user_id, &block_id, block_meta_delta_data).into(); + let _ = grid_manager + .create_grid_block_meta(&block_id, repeated_revision) + .await?; + + Ok(grid_delta_data) +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/cell_data.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/cell_data.rs deleted file mode 100644 index d173fe22d0..0000000000 --- a/frontend/rust-lib/flowy-grid/src/protobuf/model/cell_data.rs +++ /dev/null @@ -1,1655 +0,0 @@ -// This file is generated by rust-protobuf 2.25.2. Do not edit -// @generated - -// https://github.com/rust-lang/rust-clippy/issues/702 -#![allow(unknown_lints)] -#![allow(clippy::all)] - -#![allow(unused_attributes)] -#![cfg_attr(rustfmt, rustfmt::skip)] - -#![allow(box_pointers)] -#![allow(dead_code)] -#![allow(missing_docs)] -#![allow(non_camel_case_types)] -#![allow(non_snake_case)] -#![allow(non_upper_case_globals)] -#![allow(trivial_casts)] -#![allow(unused_imports)] -#![allow(unused_results)] -//! Generated file from `cell_data.proto` - -/// Generated files are compatible only with the same version -/// of protobuf runtime. -// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_25_2; - -#[derive(PartialEq,Clone,Default)] -pub struct RichTextDescription { - // message fields - pub format: ::std::string::String, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a RichTextDescription { - fn default() -> &'a RichTextDescription { - ::default_instance() - } -} - -impl RichTextDescription { - pub fn new() -> RichTextDescription { - ::std::default::Default::default() - } - - // string format = 1; - - - pub fn get_format(&self) -> &str { - &self.format - } - pub fn clear_format(&mut self) { - self.format.clear(); - } - - // Param is passed by value, moved - pub fn set_format(&mut self, v: ::std::string::String) { - self.format = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_format(&mut self) -> &mut ::std::string::String { - &mut self.format - } - - // Take field - pub fn take_format(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.format, ::std::string::String::new()) - } -} - -impl ::protobuf::Message for RichTextDescription { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.format)?; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if !self.format.is_empty() { - my_size += ::protobuf::rt::string_size(1, &self.format); - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if !self.format.is_empty() { - os.write_string(1, &self.format)?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> RichTextDescription { - RichTextDescription::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "format", - |m: &RichTextDescription| { &m.format }, - |m: &mut RichTextDescription| { &mut m.format }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "RichTextDescription", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static RichTextDescription { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(RichTextDescription::new) - } -} - -impl ::protobuf::Clear for RichTextDescription { - fn clear(&mut self) { - self.format.clear(); - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for RichTextDescription { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for RichTextDescription { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct CheckboxDescription { - // message fields - pub is_selected: bool, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a CheckboxDescription { - fn default() -> &'a CheckboxDescription { - ::default_instance() - } -} - -impl CheckboxDescription { - pub fn new() -> CheckboxDescription { - ::std::default::Default::default() - } - - // bool is_selected = 1; - - - pub fn get_is_selected(&self) -> bool { - self.is_selected - } - pub fn clear_is_selected(&mut self) { - self.is_selected = false; - } - - // Param is passed by value, moved - pub fn set_is_selected(&mut self, v: bool) { - self.is_selected = v; - } -} - -impl ::protobuf::Message for CheckboxDescription { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_bool()?; - self.is_selected = tmp; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if self.is_selected != false { - my_size += 2; - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if self.is_selected != false { - os.write_bool(1, self.is_selected)?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> CheckboxDescription { - CheckboxDescription::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( - "is_selected", - |m: &CheckboxDescription| { &m.is_selected }, - |m: &mut CheckboxDescription| { &mut m.is_selected }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "CheckboxDescription", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static CheckboxDescription { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(CheckboxDescription::new) - } -} - -impl ::protobuf::Clear for CheckboxDescription { - fn clear(&mut self) { - self.is_selected = false; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for CheckboxDescription { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for CheckboxDescription { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct DateDescription { - // message fields - pub date_format: DateFormat, - pub time_format: TimeFormat, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a DateDescription { - fn default() -> &'a DateDescription { - ::default_instance() - } -} - -impl DateDescription { - pub fn new() -> DateDescription { - ::std::default::Default::default() - } - - // .DateFormat date_format = 1; - - - pub fn get_date_format(&self) -> DateFormat { - self.date_format - } - pub fn clear_date_format(&mut self) { - self.date_format = DateFormat::Local; - } - - // Param is passed by value, moved - pub fn set_date_format(&mut self, v: DateFormat) { - self.date_format = v; - } - - // .TimeFormat time_format = 2; - - - pub fn get_time_format(&self) -> TimeFormat { - self.time_format - } - pub fn clear_time_format(&mut self) { - self.time_format = TimeFormat::TwelveHour; - } - - // Param is passed by value, moved - pub fn set_time_format(&mut self, v: TimeFormat) { - self.time_format = v; - } -} - -impl ::protobuf::Message for DateDescription { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.date_format, 1, &mut self.unknown_fields)? - }, - 2 => { - ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.time_format, 2, &mut self.unknown_fields)? - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if self.date_format != DateFormat::Local { - my_size += ::protobuf::rt::enum_size(1, self.date_format); - } - if self.time_format != TimeFormat::TwelveHour { - my_size += ::protobuf::rt::enum_size(2, self.time_format); - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if self.date_format != DateFormat::Local { - os.write_enum(1, ::protobuf::ProtobufEnum::value(&self.date_format))?; - } - if self.time_format != TimeFormat::TwelveHour { - os.write_enum(2, ::protobuf::ProtobufEnum::value(&self.time_format))?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> DateDescription { - DateDescription::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( - "date_format", - |m: &DateDescription| { &m.date_format }, - |m: &mut DateDescription| { &mut m.date_format }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( - "time_format", - |m: &DateDescription| { &m.time_format }, - |m: &mut DateDescription| { &mut m.time_format }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "DateDescription", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static DateDescription { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(DateDescription::new) - } -} - -impl ::protobuf::Clear for DateDescription { - fn clear(&mut self) { - self.date_format = DateFormat::Local; - self.time_format = TimeFormat::TwelveHour; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for DateDescription { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for DateDescription { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct SingleSelect { - // message fields - pub options: ::protobuf::RepeatedField, - pub disable_color: bool, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a SingleSelect { - fn default() -> &'a SingleSelect { - ::default_instance() - } -} - -impl SingleSelect { - pub fn new() -> SingleSelect { - ::std::default::Default::default() - } - - // repeated .SelectOption options = 1; - - - pub fn get_options(&self) -> &[SelectOption] { - &self.options - } - pub fn clear_options(&mut self) { - self.options.clear(); - } - - // Param is passed by value, moved - pub fn set_options(&mut self, v: ::protobuf::RepeatedField) { - self.options = v; - } - - // Mutable pointer to the field. - pub fn mut_options(&mut self) -> &mut ::protobuf::RepeatedField { - &mut self.options - } - - // Take field - pub fn take_options(&mut self) -> ::protobuf::RepeatedField { - ::std::mem::replace(&mut self.options, ::protobuf::RepeatedField::new()) - } - - // bool disable_color = 2; - - - pub fn get_disable_color(&self) -> bool { - self.disable_color - } - pub fn clear_disable_color(&mut self) { - self.disable_color = false; - } - - // Param is passed by value, moved - pub fn set_disable_color(&mut self, v: bool) { - self.disable_color = v; - } -} - -impl ::protobuf::Message for SingleSelect { - fn is_initialized(&self) -> bool { - for v in &self.options { - if !v.is_initialized() { - return false; - } - }; - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.options)?; - }, - 2 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_bool()?; - self.disable_color = tmp; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - for value in &self.options { - let len = value.compute_size(); - my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; - }; - if self.disable_color != false { - my_size += 2; - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - for v in &self.options { - os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; - os.write_raw_varint32(v.get_cached_size())?; - v.write_to_with_cached_sizes(os)?; - }; - if self.disable_color != false { - os.write_bool(2, self.disable_color)?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> SingleSelect { - SingleSelect::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( - "options", - |m: &SingleSelect| { &m.options }, - |m: &mut SingleSelect| { &mut m.options }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( - "disable_color", - |m: &SingleSelect| { &m.disable_color }, - |m: &mut SingleSelect| { &mut m.disable_color }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "SingleSelect", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static SingleSelect { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(SingleSelect::new) - } -} - -impl ::protobuf::Clear for SingleSelect { - fn clear(&mut self) { - self.options.clear(); - self.disable_color = false; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for SingleSelect { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for SingleSelect { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct MultiSelect { - // message fields - pub options: ::protobuf::RepeatedField, - pub disable_color: bool, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a MultiSelect { - fn default() -> &'a MultiSelect { - ::default_instance() - } -} - -impl MultiSelect { - pub fn new() -> MultiSelect { - ::std::default::Default::default() - } - - // repeated .SelectOption options = 1; - - - pub fn get_options(&self) -> &[SelectOption] { - &self.options - } - pub fn clear_options(&mut self) { - self.options.clear(); - } - - // Param is passed by value, moved - pub fn set_options(&mut self, v: ::protobuf::RepeatedField) { - self.options = v; - } - - // Mutable pointer to the field. - pub fn mut_options(&mut self) -> &mut ::protobuf::RepeatedField { - &mut self.options - } - - // Take field - pub fn take_options(&mut self) -> ::protobuf::RepeatedField { - ::std::mem::replace(&mut self.options, ::protobuf::RepeatedField::new()) - } - - // bool disable_color = 2; - - - pub fn get_disable_color(&self) -> bool { - self.disable_color - } - pub fn clear_disable_color(&mut self) { - self.disable_color = false; - } - - // Param is passed by value, moved - pub fn set_disable_color(&mut self, v: bool) { - self.disable_color = v; - } -} - -impl ::protobuf::Message for MultiSelect { - fn is_initialized(&self) -> bool { - for v in &self.options { - if !v.is_initialized() { - return false; - } - }; - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.options)?; - }, - 2 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_bool()?; - self.disable_color = tmp; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - for value in &self.options { - let len = value.compute_size(); - my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; - }; - if self.disable_color != false { - my_size += 2; - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - for v in &self.options { - os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; - os.write_raw_varint32(v.get_cached_size())?; - v.write_to_with_cached_sizes(os)?; - }; - if self.disable_color != false { - os.write_bool(2, self.disable_color)?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> MultiSelect { - MultiSelect::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( - "options", - |m: &MultiSelect| { &m.options }, - |m: &mut MultiSelect| { &mut m.options }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( - "disable_color", - |m: &MultiSelect| { &m.disable_color }, - |m: &mut MultiSelect| { &mut m.disable_color }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "MultiSelect", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static MultiSelect { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(MultiSelect::new) - } -} - -impl ::protobuf::Clear for MultiSelect { - fn clear(&mut self) { - self.options.clear(); - self.disable_color = false; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for MultiSelect { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for MultiSelect { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct SelectOption { - // message fields - pub id: ::std::string::String, - pub name: ::std::string::String, - pub color: ::std::string::String, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a SelectOption { - fn default() -> &'a SelectOption { - ::default_instance() - } -} - -impl SelectOption { - pub fn new() -> SelectOption { - ::std::default::Default::default() - } - - // string id = 1; - - - pub fn get_id(&self) -> &str { - &self.id - } - pub fn clear_id(&mut self) { - self.id.clear(); - } - - // Param is passed by value, moved - pub fn set_id(&mut self, v: ::std::string::String) { - self.id = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_id(&mut self) -> &mut ::std::string::String { - &mut self.id - } - - // Take field - pub fn take_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.id, ::std::string::String::new()) - } - - // string name = 2; - - - pub fn get_name(&self) -> &str { - &self.name - } - pub fn clear_name(&mut self) { - self.name.clear(); - } - - // Param is passed by value, moved - pub fn set_name(&mut self, v: ::std::string::String) { - self.name = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_name(&mut self) -> &mut ::std::string::String { - &mut self.name - } - - // Take field - pub fn take_name(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.name, ::std::string::String::new()) - } - - // string color = 3; - - - pub fn get_color(&self) -> &str { - &self.color - } - pub fn clear_color(&mut self) { - self.color.clear(); - } - - // Param is passed by value, moved - pub fn set_color(&mut self, v: ::std::string::String) { - self.color = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_color(&mut self) -> &mut ::std::string::String { - &mut self.color - } - - // Take field - pub fn take_color(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.color, ::std::string::String::new()) - } -} - -impl ::protobuf::Message for SelectOption { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; - }, - 2 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?; - }, - 3 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.color)?; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if !self.id.is_empty() { - my_size += ::protobuf::rt::string_size(1, &self.id); - } - if !self.name.is_empty() { - my_size += ::protobuf::rt::string_size(2, &self.name); - } - if !self.color.is_empty() { - my_size += ::protobuf::rt::string_size(3, &self.color); - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if !self.id.is_empty() { - os.write_string(1, &self.id)?; - } - if !self.name.is_empty() { - os.write_string(2, &self.name)?; - } - if !self.color.is_empty() { - os.write_string(3, &self.color)?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> SelectOption { - SelectOption::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "id", - |m: &SelectOption| { &m.id }, - |m: &mut SelectOption| { &mut m.id }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "name", - |m: &SelectOption| { &m.name }, - |m: &mut SelectOption| { &mut m.name }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "color", - |m: &SelectOption| { &m.color }, - |m: &mut SelectOption| { &mut m.color }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "SelectOption", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static SelectOption { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(SelectOption::new) - } -} - -impl ::protobuf::Clear for SelectOption { - fn clear(&mut self) { - self.id.clear(); - self.name.clear(); - self.color.clear(); - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for SelectOption { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for SelectOption { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct NumberDescription { - // message fields - pub money: FlowyMoney, - pub scale: u32, - pub symbol: ::std::string::String, - pub sign_positive: bool, - pub name: ::std::string::String, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a NumberDescription { - fn default() -> &'a NumberDescription { - ::default_instance() - } -} - -impl NumberDescription { - pub fn new() -> NumberDescription { - ::std::default::Default::default() - } - - // .FlowyMoney money = 1; - - - pub fn get_money(&self) -> FlowyMoney { - self.money - } - pub fn clear_money(&mut self) { - self.money = FlowyMoney::CNY; - } - - // Param is passed by value, moved - pub fn set_money(&mut self, v: FlowyMoney) { - self.money = v; - } - - // uint32 scale = 2; - - - pub fn get_scale(&self) -> u32 { - self.scale - } - pub fn clear_scale(&mut self) { - self.scale = 0; - } - - // Param is passed by value, moved - pub fn set_scale(&mut self, v: u32) { - self.scale = v; - } - - // string symbol = 3; - - - pub fn get_symbol(&self) -> &str { - &self.symbol - } - pub fn clear_symbol(&mut self) { - self.symbol.clear(); - } - - // Param is passed by value, moved - pub fn set_symbol(&mut self, v: ::std::string::String) { - self.symbol = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_symbol(&mut self) -> &mut ::std::string::String { - &mut self.symbol - } - - // Take field - pub fn take_symbol(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.symbol, ::std::string::String::new()) - } - - // bool sign_positive = 4; - - - pub fn get_sign_positive(&self) -> bool { - self.sign_positive - } - pub fn clear_sign_positive(&mut self) { - self.sign_positive = false; - } - - // Param is passed by value, moved - pub fn set_sign_positive(&mut self, v: bool) { - self.sign_positive = v; - } - - // string name = 5; - - - pub fn get_name(&self) -> &str { - &self.name - } - pub fn clear_name(&mut self) { - self.name.clear(); - } - - // Param is passed by value, moved - pub fn set_name(&mut self, v: ::std::string::String) { - self.name = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_name(&mut self) -> &mut ::std::string::String { - &mut self.name - } - - // Take field - pub fn take_name(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.name, ::std::string::String::new()) - } -} - -impl ::protobuf::Message for NumberDescription { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.money, 1, &mut self.unknown_fields)? - }, - 2 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_uint32()?; - self.scale = tmp; - }, - 3 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.symbol)?; - }, - 4 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_bool()?; - self.sign_positive = tmp; - }, - 5 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if self.money != FlowyMoney::CNY { - my_size += ::protobuf::rt::enum_size(1, self.money); - } - if self.scale != 0 { - my_size += ::protobuf::rt::value_size(2, self.scale, ::protobuf::wire_format::WireTypeVarint); - } - if !self.symbol.is_empty() { - my_size += ::protobuf::rt::string_size(3, &self.symbol); - } - if self.sign_positive != false { - my_size += 2; - } - if !self.name.is_empty() { - my_size += ::protobuf::rt::string_size(5, &self.name); - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if self.money != FlowyMoney::CNY { - os.write_enum(1, ::protobuf::ProtobufEnum::value(&self.money))?; - } - if self.scale != 0 { - os.write_uint32(2, self.scale)?; - } - if !self.symbol.is_empty() { - os.write_string(3, &self.symbol)?; - } - if self.sign_positive != false { - os.write_bool(4, self.sign_positive)?; - } - if !self.name.is_empty() { - os.write_string(5, &self.name)?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> NumberDescription { - NumberDescription::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( - "money", - |m: &NumberDescription| { &m.money }, - |m: &mut NumberDescription| { &mut m.money }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeUint32>( - "scale", - |m: &NumberDescription| { &m.scale }, - |m: &mut NumberDescription| { &mut m.scale }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "symbol", - |m: &NumberDescription| { &m.symbol }, - |m: &mut NumberDescription| { &mut m.symbol }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( - "sign_positive", - |m: &NumberDescription| { &m.sign_positive }, - |m: &mut NumberDescription| { &mut m.sign_positive }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "name", - |m: &NumberDescription| { &m.name }, - |m: &mut NumberDescription| { &mut m.name }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "NumberDescription", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static NumberDescription { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(NumberDescription::new) - } -} - -impl ::protobuf::Clear for NumberDescription { - fn clear(&mut self) { - self.money = FlowyMoney::CNY; - self.scale = 0; - self.symbol.clear(); - self.sign_positive = false; - self.name.clear(); - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for NumberDescription { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for NumberDescription { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(Clone,PartialEq,Eq,Debug,Hash)] -pub enum DateFormat { - Local = 0, - US = 1, - ISO = 2, - Friendly = 3, -} - -impl ::protobuf::ProtobufEnum for DateFormat { - fn value(&self) -> i32 { - *self as i32 - } - - fn from_i32(value: i32) -> ::std::option::Option { - match value { - 0 => ::std::option::Option::Some(DateFormat::Local), - 1 => ::std::option::Option::Some(DateFormat::US), - 2 => ::std::option::Option::Some(DateFormat::ISO), - 3 => ::std::option::Option::Some(DateFormat::Friendly), - _ => ::std::option::Option::None - } - } - - fn values() -> &'static [Self] { - static values: &'static [DateFormat] = &[ - DateFormat::Local, - DateFormat::US, - DateFormat::ISO, - DateFormat::Friendly, - ]; - values - } - - fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - ::protobuf::reflect::EnumDescriptor::new_pb_name::("DateFormat", file_descriptor_proto()) - }) - } -} - -impl ::std::marker::Copy for DateFormat { -} - -impl ::std::default::Default for DateFormat { - fn default() -> Self { - DateFormat::Local - } -} - -impl ::protobuf::reflect::ProtobufValue for DateFormat { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) - } -} - -#[derive(Clone,PartialEq,Eq,Debug,Hash)] -pub enum TimeFormat { - TwelveHour = 0, - TwentyFourHour = 1, -} - -impl ::protobuf::ProtobufEnum for TimeFormat { - fn value(&self) -> i32 { - *self as i32 - } - - fn from_i32(value: i32) -> ::std::option::Option { - match value { - 0 => ::std::option::Option::Some(TimeFormat::TwelveHour), - 1 => ::std::option::Option::Some(TimeFormat::TwentyFourHour), - _ => ::std::option::Option::None - } - } - - fn values() -> &'static [Self] { - static values: &'static [TimeFormat] = &[ - TimeFormat::TwelveHour, - TimeFormat::TwentyFourHour, - ]; - values - } - - fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - ::protobuf::reflect::EnumDescriptor::new_pb_name::("TimeFormat", file_descriptor_proto()) - }) - } -} - -impl ::std::marker::Copy for TimeFormat { -} - -impl ::std::default::Default for TimeFormat { - fn default() -> Self { - TimeFormat::TwelveHour - } -} - -impl ::protobuf::reflect::ProtobufValue for TimeFormat { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) - } -} - -#[derive(Clone,PartialEq,Eq,Debug,Hash)] -pub enum FlowyMoney { - CNY = 0, - EUR = 1, - USD = 2, -} - -impl ::protobuf::ProtobufEnum for FlowyMoney { - fn value(&self) -> i32 { - *self as i32 - } - - fn from_i32(value: i32) -> ::std::option::Option { - match value { - 0 => ::std::option::Option::Some(FlowyMoney::CNY), - 1 => ::std::option::Option::Some(FlowyMoney::EUR), - 2 => ::std::option::Option::Some(FlowyMoney::USD), - _ => ::std::option::Option::None - } - } - - fn values() -> &'static [Self] { - static values: &'static [FlowyMoney] = &[ - FlowyMoney::CNY, - FlowyMoney::EUR, - FlowyMoney::USD, - ]; - values - } - - fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - ::protobuf::reflect::EnumDescriptor::new_pb_name::("FlowyMoney", file_descriptor_proto()) - }) - } -} - -impl ::std::marker::Copy for FlowyMoney { -} - -impl ::std::default::Default for FlowyMoney { - fn default() -> Self { - FlowyMoney::CNY - } -} - -impl ::protobuf::reflect::ProtobufValue for FlowyMoney { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) - } -} - -static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x0fcell_data.proto\"-\n\x13RichTextDescription\x12\x16\n\x06format\ - \x18\x01\x20\x01(\tR\x06format\"6\n\x13CheckboxDescription\x12\x1f\n\x0b\ - is_selected\x18\x01\x20\x01(\x08R\nisSelected\"m\n\x0fDateDescription\ - \x12,\n\x0bdate_format\x18\x01\x20\x01(\x0e2\x0b.DateFormatR\ndateFormat\ - \x12,\n\x0btime_format\x18\x02\x20\x01(\x0e2\x0b.TimeFormatR\ntimeFormat\ - \"\\\n\x0cSingleSelect\x12'\n\x07options\x18\x01\x20\x03(\x0b2\r.SelectO\ - ptionR\x07options\x12#\n\rdisable_color\x18\x02\x20\x01(\x08R\x0cdisable\ - Color\"[\n\x0bMultiSelect\x12'\n\x07options\x18\x01\x20\x03(\x0b2\r.Sele\ - ctOptionR\x07options\x12#\n\rdisable_color\x18\x02\x20\x01(\x08R\x0cdisa\ - bleColor\"H\n\x0cSelectOption\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\ - \x12\x12\n\x04name\x18\x02\x20\x01(\tR\x04name\x12\x14\n\x05color\x18\ - \x03\x20\x01(\tR\x05color\"\x9d\x01\n\x11NumberDescription\x12!\n\x05mon\ - ey\x18\x01\x20\x01(\x0e2\x0b.FlowyMoneyR\x05money\x12\x14\n\x05scale\x18\ - \x02\x20\x01(\rR\x05scale\x12\x16\n\x06symbol\x18\x03\x20\x01(\tR\x06sym\ - bol\x12#\n\rsign_positive\x18\x04\x20\x01(\x08R\x0csignPositive\x12\x12\ - \n\x04name\x18\x05\x20\x01(\tR\x04name*6\n\nDateFormat\x12\t\n\x05Local\ - \x10\0\x12\x06\n\x02US\x10\x01\x12\x07\n\x03ISO\x10\x02\x12\x0c\n\x08Fri\ - endly\x10\x03*0\n\nTimeFormat\x12\x0e\n\nTwelveHour\x10\0\x12\x12\n\x0eT\ - wentyFourHour\x10\x01*'\n\nFlowyMoney\x12\x07\n\x03CNY\x10\0\x12\x07\n\ - \x03EUR\x10\x01\x12\x07\n\x03USD\x10\x02b\x06proto3\ -"; - -static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; - -fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { - ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() -} - -pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { - file_descriptor_proto_lazy.get(|| { - parse_descriptor_proto() - }) -} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/checkbox_description.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/checkbox_description.rs new file mode 100644 index 0000000000..276617efbd --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/checkbox_description.rs @@ -0,0 +1,193 @@ +// This file is generated by rust-protobuf 2.25.2. Do not edit +// @generated + +// https://github.com/rust-lang/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(unused_attributes)] +#![cfg_attr(rustfmt, rustfmt::skip)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unused_imports)] +#![allow(unused_results)] +//! Generated file from `checkbox_description.proto` + +/// Generated files are compatible only with the same version +/// of protobuf runtime. +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_25_2; + +#[derive(PartialEq,Clone,Default)] +pub struct CheckboxDescription { + // message fields + pub is_selected: bool, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a CheckboxDescription { + fn default() -> &'a CheckboxDescription { + ::default_instance() + } +} + +impl CheckboxDescription { + pub fn new() -> CheckboxDescription { + ::std::default::Default::default() + } + + // bool is_selected = 1; + + + pub fn get_is_selected(&self) -> bool { + self.is_selected + } + pub fn clear_is_selected(&mut self) { + self.is_selected = false; + } + + // Param is passed by value, moved + pub fn set_is_selected(&mut self, v: bool) { + self.is_selected = v; + } +} + +impl ::protobuf::Message for CheckboxDescription { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_bool()?; + self.is_selected = tmp; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if self.is_selected != false { + my_size += 2; + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if self.is_selected != false { + os.write_bool(1, self.is_selected)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> CheckboxDescription { + CheckboxDescription::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( + "is_selected", + |m: &CheckboxDescription| { &m.is_selected }, + |m: &mut CheckboxDescription| { &mut m.is_selected }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "CheckboxDescription", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static CheckboxDescription { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(CheckboxDescription::new) + } +} + +impl ::protobuf::Clear for CheckboxDescription { + fn clear(&mut self) { + self.is_selected = false; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for CheckboxDescription { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for CheckboxDescription { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\x1acheckbox_description.proto\"6\n\x13CheckboxDescription\x12\x1f\n\ + \x0bis_selected\x18\x01\x20\x01(\x08R\nisSelectedb\x06proto3\ +"; + +static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; + +fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { + ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() +} + +pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { + file_descriptor_proto_lazy.get(|| { + parse_descriptor_proto() + }) +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/dart_notification.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/dart_notification.rs new file mode 100644 index 0000000000..72b3f12abd --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/dart_notification.rs @@ -0,0 +1,102 @@ +// This file is generated by rust-protobuf 2.25.2. Do not edit +// @generated + +// https://github.com/rust-lang/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(unused_attributes)] +#![cfg_attr(rustfmt, rustfmt::skip)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unused_imports)] +#![allow(unused_results)] +//! Generated file from `dart_notification.proto` + +/// Generated files are compatible only with the same version +/// of protobuf runtime. +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_25_2; + +#[derive(Clone,PartialEq,Eq,Debug,Hash)] +pub enum GridNotification { + Unknown = 0, + GridDidUpdateBlock = 10, + GridDidCreateBlock = 11, + GridDidUpdateCells = 20, + GridDidUpdateFields = 30, +} + +impl ::protobuf::ProtobufEnum for GridNotification { + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(GridNotification::Unknown), + 10 => ::std::option::Option::Some(GridNotification::GridDidUpdateBlock), + 11 => ::std::option::Option::Some(GridNotification::GridDidCreateBlock), + 20 => ::std::option::Option::Some(GridNotification::GridDidUpdateCells), + 30 => ::std::option::Option::Some(GridNotification::GridDidUpdateFields), + _ => ::std::option::Option::None + } + } + + fn values() -> &'static [Self] { + static values: &'static [GridNotification] = &[ + GridNotification::Unknown, + GridNotification::GridDidUpdateBlock, + GridNotification::GridDidCreateBlock, + GridNotification::GridDidUpdateCells, + GridNotification::GridDidUpdateFields, + ]; + values + } + + fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + ::protobuf::reflect::EnumDescriptor::new_pb_name::("GridNotification", file_descriptor_proto()) + }) + } +} + +impl ::std::marker::Copy for GridNotification { +} + +impl ::std::default::Default for GridNotification { + fn default() -> Self { + GridNotification::Unknown + } +} + +impl ::protobuf::reflect::ProtobufValue for GridNotification { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\x17dart_notification.proto*\x80\x01\n\x10GridNotification\x12\x0b\n\ + \x07Unknown\x10\0\x12\x16\n\x12GridDidUpdateBlock\x10\n\x12\x16\n\x12Gri\ + dDidCreateBlock\x10\x0b\x12\x16\n\x12GridDidUpdateCells\x10\x14\x12\x17\ + \n\x13GridDidUpdateFields\x10\x1eb\x06proto3\ +"; + +static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; + +fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { + ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() +} + +pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { + file_descriptor_proto_lazy.get(|| { + parse_descriptor_proto() + }) +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/date_description.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/date_description.rs new file mode 100644 index 0000000000..05b2bc6a0f --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/date_description.rs @@ -0,0 +1,330 @@ +// This file is generated by rust-protobuf 2.25.2. Do not edit +// @generated + +// https://github.com/rust-lang/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(unused_attributes)] +#![cfg_attr(rustfmt, rustfmt::skip)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unused_imports)] +#![allow(unused_results)] +//! Generated file from `date_description.proto` + +/// Generated files are compatible only with the same version +/// of protobuf runtime. +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_25_2; + +#[derive(PartialEq,Clone,Default)] +pub struct DateDescription { + // message fields + pub date_format: DateFormat, + pub time_format: TimeFormat, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a DateDescription { + fn default() -> &'a DateDescription { + ::default_instance() + } +} + +impl DateDescription { + pub fn new() -> DateDescription { + ::std::default::Default::default() + } + + // .DateFormat date_format = 1; + + + pub fn get_date_format(&self) -> DateFormat { + self.date_format + } + pub fn clear_date_format(&mut self) { + self.date_format = DateFormat::Local; + } + + // Param is passed by value, moved + pub fn set_date_format(&mut self, v: DateFormat) { + self.date_format = v; + } + + // .TimeFormat time_format = 2; + + + pub fn get_time_format(&self) -> TimeFormat { + self.time_format + } + pub fn clear_time_format(&mut self) { + self.time_format = TimeFormat::TwelveHour; + } + + // Param is passed by value, moved + pub fn set_time_format(&mut self, v: TimeFormat) { + self.time_format = v; + } +} + +impl ::protobuf::Message for DateDescription { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.date_format, 1, &mut self.unknown_fields)? + }, + 2 => { + ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.time_format, 2, &mut self.unknown_fields)? + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if self.date_format != DateFormat::Local { + my_size += ::protobuf::rt::enum_size(1, self.date_format); + } + if self.time_format != TimeFormat::TwelveHour { + my_size += ::protobuf::rt::enum_size(2, self.time_format); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if self.date_format != DateFormat::Local { + os.write_enum(1, ::protobuf::ProtobufEnum::value(&self.date_format))?; + } + if self.time_format != TimeFormat::TwelveHour { + os.write_enum(2, ::protobuf::ProtobufEnum::value(&self.time_format))?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> DateDescription { + DateDescription::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( + "date_format", + |m: &DateDescription| { &m.date_format }, + |m: &mut DateDescription| { &mut m.date_format }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( + "time_format", + |m: &DateDescription| { &m.time_format }, + |m: &mut DateDescription| { &mut m.time_format }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "DateDescription", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static DateDescription { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(DateDescription::new) + } +} + +impl ::protobuf::Clear for DateDescription { + fn clear(&mut self) { + self.date_format = DateFormat::Local; + self.time_format = TimeFormat::TwelveHour; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for DateDescription { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for DateDescription { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(Clone,PartialEq,Eq,Debug,Hash)] +pub enum DateFormat { + Local = 0, + US = 1, + ISO = 2, + Friendly = 3, +} + +impl ::protobuf::ProtobufEnum for DateFormat { + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(DateFormat::Local), + 1 => ::std::option::Option::Some(DateFormat::US), + 2 => ::std::option::Option::Some(DateFormat::ISO), + 3 => ::std::option::Option::Some(DateFormat::Friendly), + _ => ::std::option::Option::None + } + } + + fn values() -> &'static [Self] { + static values: &'static [DateFormat] = &[ + DateFormat::Local, + DateFormat::US, + DateFormat::ISO, + DateFormat::Friendly, + ]; + values + } + + fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + ::protobuf::reflect::EnumDescriptor::new_pb_name::("DateFormat", file_descriptor_proto()) + }) + } +} + +impl ::std::marker::Copy for DateFormat { +} + +impl ::std::default::Default for DateFormat { + fn default() -> Self { + DateFormat::Local + } +} + +impl ::protobuf::reflect::ProtobufValue for DateFormat { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) + } +} + +#[derive(Clone,PartialEq,Eq,Debug,Hash)] +pub enum TimeFormat { + TwelveHour = 0, + TwentyFourHour = 1, +} + +impl ::protobuf::ProtobufEnum for TimeFormat { + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(TimeFormat::TwelveHour), + 1 => ::std::option::Option::Some(TimeFormat::TwentyFourHour), + _ => ::std::option::Option::None + } + } + + fn values() -> &'static [Self] { + static values: &'static [TimeFormat] = &[ + TimeFormat::TwelveHour, + TimeFormat::TwentyFourHour, + ]; + values + } + + fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + ::protobuf::reflect::EnumDescriptor::new_pb_name::("TimeFormat", file_descriptor_proto()) + }) + } +} + +impl ::std::marker::Copy for TimeFormat { +} + +impl ::std::default::Default for TimeFormat { + fn default() -> Self { + TimeFormat::TwelveHour + } +} + +impl ::protobuf::reflect::ProtobufValue for TimeFormat { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\x16date_description.proto\"m\n\x0fDateDescription\x12,\n\x0bdate_form\ + at\x18\x01\x20\x01(\x0e2\x0b.DateFormatR\ndateFormat\x12,\n\x0btime_form\ + at\x18\x02\x20\x01(\x0e2\x0b.TimeFormatR\ntimeFormat*6\n\nDateFormat\x12\ + \t\n\x05Local\x10\0\x12\x06\n\x02US\x10\x01\x12\x07\n\x03ISO\x10\x02\x12\ + \x0c\n\x08Friendly\x10\x03*0\n\nTimeFormat\x12\x0e\n\nTwelveHour\x10\0\ + \x12\x12\n\x0eTwentyFourHour\x10\x01b\x06proto3\ +"; + +static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; + +fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { + ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() +} + +pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { + file_descriptor_proto_lazy.get(|| { + parse_descriptor_proto() + }) +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/event_map.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/event_map.rs index 6884312f38..9feb87fec5 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/model/event_map.rs +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/event_map.rs @@ -26,9 +26,11 @@ #[derive(Clone,PartialEq,Eq,Debug,Hash)] pub enum GridEvent { GetGridData = 0, - GetRows = 1, - GetFields = 2, - CreateRow = 3, + GetGridBlocks = 1, + GetFields = 10, + CreateRow = 11, + GetRow = 12, + UpdateCell = 20, } impl ::protobuf::ProtobufEnum for GridEvent { @@ -39,9 +41,11 @@ impl ::protobuf::ProtobufEnum for GridEvent { fn from_i32(value: i32) -> ::std::option::Option { match value { 0 => ::std::option::Option::Some(GridEvent::GetGridData), - 1 => ::std::option::Option::Some(GridEvent::GetRows), - 2 => ::std::option::Option::Some(GridEvent::GetFields), - 3 => ::std::option::Option::Some(GridEvent::CreateRow), + 1 => ::std::option::Option::Some(GridEvent::GetGridBlocks), + 10 => ::std::option::Option::Some(GridEvent::GetFields), + 11 => ::std::option::Option::Some(GridEvent::CreateRow), + 12 => ::std::option::Option::Some(GridEvent::GetRow), + 20 => ::std::option::Option::Some(GridEvent::UpdateCell), _ => ::std::option::Option::None } } @@ -49,9 +53,11 @@ impl ::protobuf::ProtobufEnum for GridEvent { fn values() -> &'static [Self] { static values: &'static [GridEvent] = &[ GridEvent::GetGridData, - GridEvent::GetRows, + GridEvent::GetGridBlocks, GridEvent::GetFields, GridEvent::CreateRow, + GridEvent::GetRow, + GridEvent::UpdateCell, ]; values } @@ -80,9 +86,10 @@ impl ::protobuf::reflect::ProtobufValue for GridEvent { } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x0fevent_map.proto*G\n\tGridEvent\x12\x0f\n\x0bGetGridData\x10\0\x12\ - \x0b\n\x07GetRows\x10\x01\x12\r\n\tGetFields\x10\x02\x12\r\n\tCreateRow\ - \x10\x03b\x06proto3\ + \n\x0fevent_map.proto*i\n\tGridEvent\x12\x0f\n\x0bGetGridData\x10\0\x12\ + \x11\n\rGetGridBlocks\x10\x01\x12\r\n\tGetFields\x10\n\x12\r\n\tCreateRo\ + w\x10\x0b\x12\n\n\x06GetRow\x10\x0c\x12\x0e\n\nUpdateCell\x10\x14b\x06pr\ + oto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/mod.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/mod.rs index 55aeddc863..a616a281d6 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/model/mod.rs +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/mod.rs @@ -1,8 +1,23 @@ #![cfg_attr(rustfmt, rustfmt::skip)] // Auto-generated, do not edit -mod cell_data; -pub use cell_data::*; +mod date_description; +pub use date_description::*; + +mod text_description; +pub use text_description::*; + +mod dart_notification; +pub use dart_notification::*; + +mod checkbox_description; +pub use checkbox_description::*; + +mod selection_description; +pub use selection_description::*; mod event_map; pub use event_map::*; + +mod number_description; +pub use number_description::*; diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/number_description.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/number_description.rs new file mode 100644 index 0000000000..2137ea2be1 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/number_description.rs @@ -0,0 +1,404 @@ +// This file is generated by rust-protobuf 2.25.2. Do not edit +// @generated + +// https://github.com/rust-lang/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(unused_attributes)] +#![cfg_attr(rustfmt, rustfmt::skip)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unused_imports)] +#![allow(unused_results)] +//! Generated file from `number_description.proto` + +/// Generated files are compatible only with the same version +/// of protobuf runtime. +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_25_2; + +#[derive(PartialEq,Clone,Default)] +pub struct NumberDescription { + // message fields + pub format: NumberFormat, + pub scale: u32, + pub symbol: ::std::string::String, + pub sign_positive: bool, + pub name: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a NumberDescription { + fn default() -> &'a NumberDescription { + ::default_instance() + } +} + +impl NumberDescription { + pub fn new() -> NumberDescription { + ::std::default::Default::default() + } + + // .NumberFormat format = 1; + + + pub fn get_format(&self) -> NumberFormat { + self.format + } + pub fn clear_format(&mut self) { + self.format = NumberFormat::Number; + } + + // Param is passed by value, moved + pub fn set_format(&mut self, v: NumberFormat) { + self.format = v; + } + + // uint32 scale = 2; + + + pub fn get_scale(&self) -> u32 { + self.scale + } + pub fn clear_scale(&mut self) { + self.scale = 0; + } + + // Param is passed by value, moved + pub fn set_scale(&mut self, v: u32) { + self.scale = v; + } + + // string symbol = 3; + + + pub fn get_symbol(&self) -> &str { + &self.symbol + } + pub fn clear_symbol(&mut self) { + self.symbol.clear(); + } + + // Param is passed by value, moved + pub fn set_symbol(&mut self, v: ::std::string::String) { + self.symbol = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_symbol(&mut self) -> &mut ::std::string::String { + &mut self.symbol + } + + // Take field + pub fn take_symbol(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.symbol, ::std::string::String::new()) + } + + // bool sign_positive = 4; + + + pub fn get_sign_positive(&self) -> bool { + self.sign_positive + } + pub fn clear_sign_positive(&mut self) { + self.sign_positive = false; + } + + // Param is passed by value, moved + pub fn set_sign_positive(&mut self, v: bool) { + self.sign_positive = v; + } + + // string name = 5; + + + pub fn get_name(&self) -> &str { + &self.name + } + pub fn clear_name(&mut self) { + self.name.clear(); + } + + // Param is passed by value, moved + pub fn set_name(&mut self, v: ::std::string::String) { + self.name = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_name(&mut self) -> &mut ::std::string::String { + &mut self.name + } + + // Take field + pub fn take_name(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.name, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for NumberDescription { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.format, 1, &mut self.unknown_fields)? + }, + 2 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_uint32()?; + self.scale = tmp; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.symbol)?; + }, + 4 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_bool()?; + self.sign_positive = tmp; + }, + 5 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if self.format != NumberFormat::Number { + my_size += ::protobuf::rt::enum_size(1, self.format); + } + if self.scale != 0 { + my_size += ::protobuf::rt::value_size(2, self.scale, ::protobuf::wire_format::WireTypeVarint); + } + if !self.symbol.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.symbol); + } + if self.sign_positive != false { + my_size += 2; + } + if !self.name.is_empty() { + my_size += ::protobuf::rt::string_size(5, &self.name); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if self.format != NumberFormat::Number { + os.write_enum(1, ::protobuf::ProtobufEnum::value(&self.format))?; + } + if self.scale != 0 { + os.write_uint32(2, self.scale)?; + } + if !self.symbol.is_empty() { + os.write_string(3, &self.symbol)?; + } + if self.sign_positive != false { + os.write_bool(4, self.sign_positive)?; + } + if !self.name.is_empty() { + os.write_string(5, &self.name)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> NumberDescription { + NumberDescription::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( + "format", + |m: &NumberDescription| { &m.format }, + |m: &mut NumberDescription| { &mut m.format }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeUint32>( + "scale", + |m: &NumberDescription| { &m.scale }, + |m: &mut NumberDescription| { &mut m.scale }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "symbol", + |m: &NumberDescription| { &m.symbol }, + |m: &mut NumberDescription| { &mut m.symbol }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( + "sign_positive", + |m: &NumberDescription| { &m.sign_positive }, + |m: &mut NumberDescription| { &mut m.sign_positive }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "name", + |m: &NumberDescription| { &m.name }, + |m: &mut NumberDescription| { &mut m.name }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "NumberDescription", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static NumberDescription { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(NumberDescription::new) + } +} + +impl ::protobuf::Clear for NumberDescription { + fn clear(&mut self) { + self.format = NumberFormat::Number; + self.scale = 0; + self.symbol.clear(); + self.sign_positive = false; + self.name.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for NumberDescription { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for NumberDescription { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(Clone,PartialEq,Eq,Debug,Hash)] +pub enum NumberFormat { + Number = 0, + USD = 1, + CNY = 2, + EUR = 3, +} + +impl ::protobuf::ProtobufEnum for NumberFormat { + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(NumberFormat::Number), + 1 => ::std::option::Option::Some(NumberFormat::USD), + 2 => ::std::option::Option::Some(NumberFormat::CNY), + 3 => ::std::option::Option::Some(NumberFormat::EUR), + _ => ::std::option::Option::None + } + } + + fn values() -> &'static [Self] { + static values: &'static [NumberFormat] = &[ + NumberFormat::Number, + NumberFormat::USD, + NumberFormat::CNY, + NumberFormat::EUR, + ]; + values + } + + fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + ::protobuf::reflect::EnumDescriptor::new_pb_name::("NumberFormat", file_descriptor_proto()) + }) + } +} + +impl ::std::marker::Copy for NumberFormat { +} + +impl ::std::default::Default for NumberFormat { + fn default() -> Self { + NumberFormat::Number + } +} + +impl ::protobuf::reflect::ProtobufValue for NumberFormat { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\x18number_description.proto\"\xa1\x01\n\x11NumberDescription\x12%\n\ + \x06format\x18\x01\x20\x01(\x0e2\r.NumberFormatR\x06format\x12\x14\n\x05\ + scale\x18\x02\x20\x01(\rR\x05scale\x12\x16\n\x06symbol\x18\x03\x20\x01(\ + \tR\x06symbol\x12#\n\rsign_positive\x18\x04\x20\x01(\x08R\x0csignPositiv\ + e\x12\x12\n\x04name\x18\x05\x20\x01(\tR\x04name*5\n\x0cNumberFormat\x12\ + \n\n\x06Number\x10\0\x12\x07\n\x03USD\x10\x01\x12\x07\n\x03CNY\x10\x02\ + \x12\x07\n\x03EUR\x10\x03b\x06proto3\ +"; + +static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; + +fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { + ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() +} + +pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { + file_descriptor_proto_lazy.get(|| { + parse_descriptor_proto() + }) +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/selection_description.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/selection_description.rs new file mode 100644 index 0000000000..9feda09402 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/selection_description.rs @@ -0,0 +1,692 @@ +// This file is generated by rust-protobuf 2.25.2. Do not edit +// @generated + +// https://github.com/rust-lang/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(unused_attributes)] +#![cfg_attr(rustfmt, rustfmt::skip)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unused_imports)] +#![allow(unused_results)] +//! Generated file from `selection_description.proto` + +/// Generated files are compatible only with the same version +/// of protobuf runtime. +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_25_2; + +#[derive(PartialEq,Clone,Default)] +pub struct SingleSelectDescription { + // message fields + pub options: ::protobuf::RepeatedField, + pub disable_color: bool, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a SingleSelectDescription { + fn default() -> &'a SingleSelectDescription { + ::default_instance() + } +} + +impl SingleSelectDescription { + pub fn new() -> SingleSelectDescription { + ::std::default::Default::default() + } + + // repeated .SelectOption options = 1; + + + pub fn get_options(&self) -> &[SelectOption] { + &self.options + } + pub fn clear_options(&mut self) { + self.options.clear(); + } + + // Param is passed by value, moved + pub fn set_options(&mut self, v: ::protobuf::RepeatedField) { + self.options = v; + } + + // Mutable pointer to the field. + pub fn mut_options(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.options + } + + // Take field + pub fn take_options(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.options, ::protobuf::RepeatedField::new()) + } + + // bool disable_color = 2; + + + pub fn get_disable_color(&self) -> bool { + self.disable_color + } + pub fn clear_disable_color(&mut self) { + self.disable_color = false; + } + + // Param is passed by value, moved + pub fn set_disable_color(&mut self, v: bool) { + self.disable_color = v; + } +} + +impl ::protobuf::Message for SingleSelectDescription { + fn is_initialized(&self) -> bool { + for v in &self.options { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.options)?; + }, + 2 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_bool()?; + self.disable_color = tmp; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + for value in &self.options { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + if self.disable_color != false { + my_size += 2; + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + for v in &self.options { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + if self.disable_color != false { + os.write_bool(2, self.disable_color)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> SingleSelectDescription { + SingleSelectDescription::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "options", + |m: &SingleSelectDescription| { &m.options }, + |m: &mut SingleSelectDescription| { &mut m.options }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( + "disable_color", + |m: &SingleSelectDescription| { &m.disable_color }, + |m: &mut SingleSelectDescription| { &mut m.disable_color }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "SingleSelectDescription", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static SingleSelectDescription { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(SingleSelectDescription::new) + } +} + +impl ::protobuf::Clear for SingleSelectDescription { + fn clear(&mut self) { + self.options.clear(); + self.disable_color = false; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for SingleSelectDescription { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for SingleSelectDescription { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct MultiSelectDescription { + // message fields + pub options: ::protobuf::RepeatedField, + pub disable_color: bool, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a MultiSelectDescription { + fn default() -> &'a MultiSelectDescription { + ::default_instance() + } +} + +impl MultiSelectDescription { + pub fn new() -> MultiSelectDescription { + ::std::default::Default::default() + } + + // repeated .SelectOption options = 1; + + + pub fn get_options(&self) -> &[SelectOption] { + &self.options + } + pub fn clear_options(&mut self) { + self.options.clear(); + } + + // Param is passed by value, moved + pub fn set_options(&mut self, v: ::protobuf::RepeatedField) { + self.options = v; + } + + // Mutable pointer to the field. + pub fn mut_options(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.options + } + + // Take field + pub fn take_options(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.options, ::protobuf::RepeatedField::new()) + } + + // bool disable_color = 2; + + + pub fn get_disable_color(&self) -> bool { + self.disable_color + } + pub fn clear_disable_color(&mut self) { + self.disable_color = false; + } + + // Param is passed by value, moved + pub fn set_disable_color(&mut self, v: bool) { + self.disable_color = v; + } +} + +impl ::protobuf::Message for MultiSelectDescription { + fn is_initialized(&self) -> bool { + for v in &self.options { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.options)?; + }, + 2 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_bool()?; + self.disable_color = tmp; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + for value in &self.options { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + if self.disable_color != false { + my_size += 2; + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + for v in &self.options { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + if self.disable_color != false { + os.write_bool(2, self.disable_color)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> MultiSelectDescription { + MultiSelectDescription::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "options", + |m: &MultiSelectDescription| { &m.options }, + |m: &mut MultiSelectDescription| { &mut m.options }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( + "disable_color", + |m: &MultiSelectDescription| { &m.disable_color }, + |m: &mut MultiSelectDescription| { &mut m.disable_color }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "MultiSelectDescription", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static MultiSelectDescription { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(MultiSelectDescription::new) + } +} + +impl ::protobuf::Clear for MultiSelectDescription { + fn clear(&mut self) { + self.options.clear(); + self.disable_color = false; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for MultiSelectDescription { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for MultiSelectDescription { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct SelectOption { + // message fields + pub id: ::std::string::String, + pub name: ::std::string::String, + pub color: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a SelectOption { + fn default() -> &'a SelectOption { + ::default_instance() + } +} + +impl SelectOption { + pub fn new() -> SelectOption { + ::std::default::Default::default() + } + + // string id = 1; + + + pub fn get_id(&self) -> &str { + &self.id + } + pub fn clear_id(&mut self) { + self.id.clear(); + } + + // Param is passed by value, moved + pub fn set_id(&mut self, v: ::std::string::String) { + self.id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_id(&mut self) -> &mut ::std::string::String { + &mut self.id + } + + // Take field + pub fn take_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.id, ::std::string::String::new()) + } + + // string name = 2; + + + pub fn get_name(&self) -> &str { + &self.name + } + pub fn clear_name(&mut self) { + self.name.clear(); + } + + // Param is passed by value, moved + pub fn set_name(&mut self, v: ::std::string::String) { + self.name = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_name(&mut self) -> &mut ::std::string::String { + &mut self.name + } + + // Take field + pub fn take_name(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.name, ::std::string::String::new()) + } + + // string color = 3; + + + pub fn get_color(&self) -> &str { + &self.color + } + pub fn clear_color(&mut self) { + self.color.clear(); + } + + // Param is passed by value, moved + pub fn set_color(&mut self, v: ::std::string::String) { + self.color = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_color(&mut self) -> &mut ::std::string::String { + &mut self.color + } + + // Take field + pub fn take_color(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.color, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for SelectOption { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.color)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.id); + } + if !self.name.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.name); + } + if !self.color.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.color); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.id.is_empty() { + os.write_string(1, &self.id)?; + } + if !self.name.is_empty() { + os.write_string(2, &self.name)?; + } + if !self.color.is_empty() { + os.write_string(3, &self.color)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> SelectOption { + SelectOption::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "id", + |m: &SelectOption| { &m.id }, + |m: &mut SelectOption| { &mut m.id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "name", + |m: &SelectOption| { &m.name }, + |m: &mut SelectOption| { &mut m.name }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "color", + |m: &SelectOption| { &m.color }, + |m: &mut SelectOption| { &mut m.color }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "SelectOption", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static SelectOption { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(SelectOption::new) + } +} + +impl ::protobuf::Clear for SelectOption { + fn clear(&mut self) { + self.id.clear(); + self.name.clear(); + self.color.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for SelectOption { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for SelectOption { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\x1bselection_description.proto\"g\n\x17SingleSelectDescription\x12'\n\ + \x07options\x18\x01\x20\x03(\x0b2\r.SelectOptionR\x07options\x12#\n\rdis\ + able_color\x18\x02\x20\x01(\x08R\x0cdisableColor\"f\n\x16MultiSelectDesc\ + ription\x12'\n\x07options\x18\x01\x20\x03(\x0b2\r.SelectOptionR\x07optio\ + ns\x12#\n\rdisable_color\x18\x02\x20\x01(\x08R\x0cdisableColor\"H\n\x0cS\ + electOption\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12\x12\n\x04name\ + \x18\x02\x20\x01(\tR\x04name\x12\x14\n\x05color\x18\x03\x20\x01(\tR\x05c\ + olorb\x06proto3\ +"; + +static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; + +fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { + ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() +} + +pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { + file_descriptor_proto_lazy.get(|| { + parse_descriptor_proto() + }) +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/text_description.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/text_description.rs new file mode 100644 index 0000000000..ca2d720e14 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/text_description.rs @@ -0,0 +1,200 @@ +// This file is generated by rust-protobuf 2.25.2. Do not edit +// @generated + +// https://github.com/rust-lang/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(unused_attributes)] +#![cfg_attr(rustfmt, rustfmt::skip)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unused_imports)] +#![allow(unused_results)] +//! Generated file from `text_description.proto` + +/// Generated files are compatible only with the same version +/// of protobuf runtime. +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_25_2; + +#[derive(PartialEq,Clone,Default)] +pub struct RichTextDescription { + // message fields + pub format: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a RichTextDescription { + fn default() -> &'a RichTextDescription { + ::default_instance() + } +} + +impl RichTextDescription { + pub fn new() -> RichTextDescription { + ::std::default::Default::default() + } + + // string format = 1; + + + pub fn get_format(&self) -> &str { + &self.format + } + pub fn clear_format(&mut self) { + self.format.clear(); + } + + // Param is passed by value, moved + pub fn set_format(&mut self, v: ::std::string::String) { + self.format = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_format(&mut self) -> &mut ::std::string::String { + &mut self.format + } + + // Take field + pub fn take_format(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.format, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for RichTextDescription { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.format)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.format.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.format); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.format.is_empty() { + os.write_string(1, &self.format)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> RichTextDescription { + RichTextDescription::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "format", + |m: &RichTextDescription| { &m.format }, + |m: &mut RichTextDescription| { &mut m.format }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "RichTextDescription", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static RichTextDescription { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(RichTextDescription::new) + } +} + +impl ::protobuf::Clear for RichTextDescription { + fn clear(&mut self) { + self.format.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for RichTextDescription { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for RichTextDescription { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\x16text_description.proto\"-\n\x13RichTextDescription\x12\x16\n\x06fo\ + rmat\x18\x01\x20\x01(\tR\x06formatb\x06proto3\ +"; + +static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; + +fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { + ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() +} + +pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { + file_descriptor_proto_lazy.get(|| { + parse_descriptor_proto() + }) +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/cell_data.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/cell_data.proto deleted file mode 100644 index dc146af19e..0000000000 --- a/frontend/rust-lib/flowy-grid/src/protobuf/proto/cell_data.proto +++ /dev/null @@ -1,47 +0,0 @@ -syntax = "proto3"; - -message RichTextDescription { - string format = 1; -} -message CheckboxDescription { - bool is_selected = 1; -} -message DateDescription { - DateFormat date_format = 1; - TimeFormat time_format = 2; -} -message SingleSelect { - repeated SelectOption options = 1; - bool disable_color = 2; -} -message MultiSelect { - repeated SelectOption options = 1; - bool disable_color = 2; -} -message SelectOption { - string id = 1; - string name = 2; - string color = 3; -} -message NumberDescription { - FlowyMoney money = 1; - uint32 scale = 2; - string symbol = 3; - bool sign_positive = 4; - string name = 5; -} -enum DateFormat { - Local = 0; - US = 1; - ISO = 2; - Friendly = 3; -} -enum TimeFormat { - TwelveHour = 0; - TwentyFourHour = 1; -} -enum FlowyMoney { - CNY = 0; - EUR = 1; - USD = 2; -} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/checkbox_description.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/checkbox_description.proto new file mode 100644 index 0000000000..7c14ebc075 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/checkbox_description.proto @@ -0,0 +1,5 @@ +syntax = "proto3"; + +message CheckboxDescription { + bool is_selected = 1; +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/dart_notification.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/dart_notification.proto new file mode 100644 index 0000000000..0262b34477 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/dart_notification.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +enum GridNotification { + Unknown = 0; + GridDidUpdateBlock = 10; + GridDidCreateBlock = 11; + GridDidUpdateCells = 20; + GridDidUpdateFields = 30; +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/date_description.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/date_description.proto new file mode 100644 index 0000000000..9fe4c4acfd --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/date_description.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +message DateDescription { + DateFormat date_format = 1; + TimeFormat time_format = 2; +} +enum DateFormat { + Local = 0; + US = 1; + ISO = 2; + Friendly = 3; +} +enum TimeFormat { + TwelveHour = 0; + TwentyFourHour = 1; +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/event_map.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/event_map.proto index 0f5de19e98..6c39e618f5 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/proto/event_map.proto +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/event_map.proto @@ -2,7 +2,9 @@ syntax = "proto3"; enum GridEvent { GetGridData = 0; - GetRows = 1; - GetFields = 2; - CreateRow = 3; + GetGridBlocks = 1; + GetFields = 10; + CreateRow = 11; + GetRow = 12; + UpdateCell = 20; } diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/number_description.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/number_description.proto new file mode 100644 index 0000000000..760f6623c4 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/number_description.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +message NumberDescription { + NumberFormat format = 1; + uint32 scale = 2; + string symbol = 3; + bool sign_positive = 4; + string name = 5; +} +enum NumberFormat { + Number = 0; + USD = 1; + CNY = 2; + EUR = 3; +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/selection_description.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/selection_description.proto new file mode 100644 index 0000000000..7f3ee25661 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/selection_description.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +message SingleSelectDescription { + repeated SelectOption options = 1; + bool disable_color = 2; +} +message MultiSelectDescription { + repeated SelectOption options = 1; + bool disable_color = 2; +} +message SelectOption { + string id = 1; + string name = 2; + string color = 3; +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/text_description.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/text_description.proto new file mode 100644 index 0000000000..c4ee8f8de6 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/text_description.proto @@ -0,0 +1,5 @@ +syntax = "proto3"; + +message RichTextDescription { + string format = 1; +} diff --git a/frontend/rust-lib/flowy-grid/src/services/block_meta_editor.rs b/frontend/rust-lib/flowy-grid/src/services/block_meta_editor.rs new file mode 100644 index 0000000000..650b537221 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/block_meta_editor.rs @@ -0,0 +1,386 @@ +use crate::manager::GridUser; +use crate::services::row::{make_cell, make_row_ids_per_block, GridBlockMetaData}; +use bytes::Bytes; + +use crate::dart_notification::{send_dart_notification, GridNotification}; +use dashmap::DashMap; +use flowy_collaboration::client_grid::{GridBlockMetaChange, GridBlockMetaPad}; +use flowy_collaboration::entities::revision::Revision; +use flowy_collaboration::util::make_delta_from_revisions; +use flowy_error::{FlowyError, FlowyResult}; +use flowy_grid_data_model::entities::{ + FieldMeta, GridBlockId, GridBlockMeta, GridBlockMetaChangeset, RepeatedCell, RowMeta, RowMetaChangeset, RowOrder, +}; +use flowy_sync::disk::SQLiteGridBlockMetaRevisionPersistence; +use flowy_sync::{ + RevisionCloudService, RevisionCompactor, RevisionManager, RevisionObjectBuilder, RevisionPersistence, +}; +use lib_infra::future::FutureResult; +use lib_ot::core::PlainTextAttributes; +use std::collections::HashMap; +use std::sync::Arc; +use tokio::sync::RwLock; + +type RowId = String; +type BlockId = String; + +pub(crate) struct GridBlockMetaEditorManager { + grid_id: String, + user: Arc, + editor_map: DashMap>, + block_id_by_row_id: DashMap, +} + +impl GridBlockMetaEditorManager { + pub(crate) async fn new(grid_id: &str, user: &Arc, blocks: Vec) -> FlowyResult { + let editor_map = make_block_meta_editor_map(user, blocks).await?; + let user = user.clone(); + let block_id_by_row_id = DashMap::new(); + let grid_id = grid_id.to_owned(); + let manager = Self { + grid_id, + user, + editor_map, + block_id_by_row_id, + }; + Ok(manager) + } + + pub(crate) async fn get_editor(&self, block_id: &str) -> FlowyResult> { + match self.editor_map.get(block_id) { + None => { + tracing::error!("The is a fatal error, block is not exist"); + let editor = Arc::new(make_block_meta_editor(&self.user, block_id).await?); + self.editor_map.insert(block_id.to_owned(), editor.clone()); + Ok(editor) + } + Some(editor) => Ok(editor.clone()), + } + } + + pub(crate) async fn create_row( + &self, + block_id: &str, + row_meta: RowMeta, + start_row_id: Option, + ) -> FlowyResult { + self.block_id_by_row_id + .insert(row_meta.id.clone(), row_meta.block_id.clone()); + let editor = self.get_editor(&row_meta.block_id).await?; + let row_count = editor.create_row(row_meta, start_row_id).await?; + self.notify_did_update_block(block_id).await?; + Ok(row_count) + } + + pub(crate) async fn insert_row( + &self, + rows_by_block_id: HashMap>, + ) -> FlowyResult> { + let mut changesets = vec![]; + for (block_id, row_metas) in rows_by_block_id { + let editor = self.get_editor(&block_id).await?; + let mut row_count = 0; + for row in &row_metas { + self.block_id_by_row_id.insert(row.id.clone(), row.block_id.clone()); + row_count = editor.create_row(row.clone(), None).await?; + } + changesets.push(GridBlockMetaChangeset::from_row_count(&block_id, row_count)); + let _ = self.notify_did_update_block(&block_id).await?; + } + + Ok(changesets) + } + + pub(crate) async fn delete_rows(&self, row_orders: Vec) -> FlowyResult> { + let mut changesets = vec![]; + let row_ids_per_blocks = make_row_ids_per_block(&row_orders); + for row_ids_per_block in row_ids_per_blocks { + let editor = self.get_editor(&row_ids_per_block.block_id).await?; + let row_count = editor.delete_rows(row_ids_per_block.row_ids).await?; + + let changeset = GridBlockMetaChangeset::from_row_count(&row_ids_per_block.block_id, row_count); + changesets.push(changeset); + } + + Ok(changesets) + } + + pub async fn update_row(&self, changeset: RowMetaChangeset) -> FlowyResult<()> { + let editor = self.get_editor_from_row_id(&changeset.row_id).await?; + let _ = editor.update_row(changeset.clone()).await?; + let _ = self.notify_did_update_block(&editor.block_id).await?; + Ok(()) + } + + pub async fn get_row(&self, block_id: &str, row_id: &str) -> FlowyResult>> { + let editor = self.get_editor(block_id).await?; + let mut row_metas = editor.get_row_metas(Some(vec![row_id.to_owned()])).await?; + if row_metas.is_empty() { + Ok(None) + } else { + Ok(row_metas.pop()) + } + } + + pub async fn update_cells(&self, field_metas: &[FieldMeta], changeset: RowMetaChangeset) -> FlowyResult<()> { + let editor = self.get_editor_from_row_id(&changeset.row_id).await?; + let _ = editor.update_row(changeset.clone()).await?; + self.notify_did_update_cells(changeset, field_metas)?; + Ok(()) + } + + pub(crate) async fn get_block_meta_data_from_blocks( + &self, + grid_blocks: Vec, + ) -> FlowyResult> { + let mut snapshots = vec![]; + for grid_block in grid_blocks { + let editor = self.get_editor(&grid_block.block_id).await?; + let row_metas = editor.get_row_metas(None).await?; + row_metas.iter().for_each(|row_meta| { + self.block_id_by_row_id + .insert(row_meta.id.clone(), row_meta.block_id.clone()); + }); + + snapshots.push(GridBlockMetaData { + block_id: grid_block.block_id, + row_metas, + }); + } + Ok(snapshots) + } + + pub(crate) async fn get_block_meta_data(&self, block_ids: &[String]) -> FlowyResult> { + let mut snapshots = vec![]; + for block_id in block_ids { + let editor = self.get_editor(block_id).await?; + let row_metas = editor.get_row_metas(None).await?; + row_metas.iter().for_each(|row_meta| { + self.block_id_by_row_id + .insert(row_meta.id.clone(), row_meta.block_id.clone()); + }); + snapshots.push(GridBlockMetaData { + block_id: block_id.clone(), + row_metas, + }); + } + Ok(snapshots) + } + + async fn get_editor_from_row_id(&self, row_id: &str) -> FlowyResult> { + match self.block_id_by_row_id.get(row_id) { + None => { + let msg = format!( + "Update Row failed. Can't find the corresponding block with row_id: {}", + row_id + ); + Err(FlowyError::internal().context(msg)) + } + Some(block_id) => { + let editor = self.get_editor(&block_id).await?; + Ok(editor) + } + } + } + + async fn notify_did_update_block(&self, block_id: &str) -> FlowyResult<()> { + let block_id = GridBlockId { + value: block_id.to_owned(), + }; + send_dart_notification(&self.grid_id, GridNotification::GridDidUpdateBlock) + .payload(block_id) + .send(); + Ok(()) + } + + fn notify_did_update_cells(&self, changeset: RowMetaChangeset, field_metas: &[FieldMeta]) -> FlowyResult<()> { + let field_meta_map = field_metas + .iter() + .map(|field_meta| (&field_meta.id, field_meta)) + .collect::>(); + + let mut cells = vec![]; + changeset + .cell_by_field_id + .into_iter() + .for_each( + |(field_id, cell_meta)| match make_cell(&field_meta_map, field_id, cell_meta) { + None => {} + Some((_, cell)) => cells.push(cell), + }, + ); + + if !cells.is_empty() { + send_dart_notification(&changeset.row_id, GridNotification::GridDidUpdateCells) + .payload(RepeatedCell::from(cells)) + .send(); + } + Ok(()) + } +} + +async fn make_block_meta_editor_map( + user: &Arc, + blocks: Vec, +) -> FlowyResult>> { + let editor_map = DashMap::new(); + for block in blocks { + let editor = make_block_meta_editor(user, &block.block_id).await?; + editor_map.insert(block.block_id, Arc::new(editor)); + } + + Ok(editor_map) +} + +async fn make_block_meta_editor(user: &Arc, block_id: &str) -> FlowyResult { + let token = user.token()?; + let user_id = user.user_id()?; + let pool = user.db_pool()?; + + let disk_cache = Arc::new(SQLiteGridBlockMetaRevisionPersistence::new(&user_id, pool)); + let rev_persistence = Arc::new(RevisionPersistence::new(&user_id, block_id, disk_cache)); + let rev_manager = RevisionManager::new(&user_id, block_id, rev_persistence); + ClientGridBlockMetaEditor::new(&user_id, &token, block_id, rev_manager).await +} + +pub struct ClientGridBlockMetaEditor { + user_id: String, + pub block_id: String, + pad: Arc>, + rev_manager: Arc, +} + +impl ClientGridBlockMetaEditor { + pub async fn new( + user_id: &str, + token: &str, + block_id: &str, + mut rev_manager: RevisionManager, + ) -> FlowyResult { + let cloud = Arc::new(GridBlockMetaRevisionCloudService { + token: token.to_owned(), + }); + let block_meta_pad = rev_manager.load::(Some(cloud)).await?; + let pad = Arc::new(RwLock::new(block_meta_pad)); + let rev_manager = Arc::new(rev_manager); + let user_id = user_id.to_owned(); + let block_id = block_id.to_owned(); + Ok(Self { + user_id, + block_id, + pad, + rev_manager, + }) + } + + async fn create_row(&self, row: RowMeta, start_row_id: Option) -> FlowyResult { + let mut row_count = 0; + let _ = self + .modify(|pad| { + let change = pad.add_row(row, start_row_id)?; + row_count = pad.number_of_rows(); + Ok(change) + }) + .await?; + + Ok(row_count) + } + + pub async fn delete_rows(&self, ids: Vec) -> FlowyResult { + let mut row_count = 0; + let _ = self + .modify(|pad| { + let changeset = pad.delete_rows(&ids)?; + row_count = pad.number_of_rows(); + Ok(changeset) + }) + .await?; + Ok(row_count) + } + + pub async fn update_row(&self, changeset: RowMetaChangeset) -> FlowyResult<()> { + let _ = self.modify(|pad| Ok(pad.update_row(changeset)?)).await?; + Ok(()) + } + + pub async fn get_row_metas(&self, row_ids: Option>) -> FlowyResult>> { + let row_metas = self.pad.read().await.get_rows(row_ids)?; + Ok(row_metas) + } + + pub async fn get_row_orders(&self, row_ids: Option>) -> FlowyResult> { + let row_orders = self + .pad + .read() + .await + .get_rows(row_ids)? + .iter() + .map(RowOrder::from) + .collect::>(); + Ok(row_orders) + } + + async fn modify(&self, f: F) -> FlowyResult<()> + where + F: for<'a> FnOnce(&'a mut GridBlockMetaPad) -> FlowyResult>, + { + let mut write_guard = self.pad.write().await; + match f(&mut *write_guard)? { + None => {} + Some(change) => { + let _ = self.apply_change(change).await?; + } + } + Ok(()) + } + + async fn apply_change(&self, change: GridBlockMetaChange) -> FlowyResult<()> { + let GridBlockMetaChange { delta, md5 } = change; + let user_id = self.user_id.clone(); + let (base_rev_id, rev_id) = self.rev_manager.next_rev_id_pair(); + let delta_data = delta.to_delta_bytes(); + let revision = Revision::new( + &self.rev_manager.object_id, + base_rev_id, + rev_id, + delta_data, + &user_id, + md5, + ); + let _ = self + .rev_manager + .add_local_revision(&revision, Box::new(GridBlockMetaRevisionCompactor())) + .await?; + Ok(()) + } +} + +struct GridBlockMetaRevisionCloudService { + #[allow(dead_code)] + token: String, +} + +impl RevisionCloudService for GridBlockMetaRevisionCloudService { + #[tracing::instrument(level = "trace", skip(self))] + fn fetch_object(&self, _user_id: &str, _object_id: &str) -> FutureResult, FlowyError> { + FutureResult::new(async move { Ok(vec![]) }) + } +} + +struct GridBlockMetaPadBuilder(); +impl RevisionObjectBuilder for GridBlockMetaPadBuilder { + type Output = GridBlockMetaPad; + + fn build_object(object_id: &str, revisions: Vec) -> FlowyResult { + let pad = GridBlockMetaPad::from_revisions(object_id, revisions)?; + Ok(pad) + } +} + +struct GridBlockMetaRevisionCompactor(); +impl RevisionCompactor for GridBlockMetaRevisionCompactor { + fn bytes_from_revisions(&self, revisions: Vec) -> FlowyResult { + let delta = make_delta_from_revisions::(revisions)?; + Ok(delta.to_delta_bytes()) + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/builder/mod.rs b/frontend/rust-lib/flowy-grid/src/services/cell/builder/mod.rs new file mode 100644 index 0000000000..6812d2c39d --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/cell/builder/mod.rs @@ -0,0 +1,137 @@ +use crate::services::cell::*; +use crate::services::field::TypeOptionsBuilder; +use flowy_grid_data_model::entities::FieldType; + +// Text +#[derive(Default)] +pub struct RichTextTypeOptionsBuilder(RichTextDescription); + +impl TypeOptionsBuilder for RichTextTypeOptionsBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn build(&self) -> String { + self.0.clone().into() + } +} + +// Number +#[derive(Default)] +pub struct NumberTypeOptionsBuilder(NumberDescription); + +impl NumberTypeOptionsBuilder { + pub fn name(mut self, name: &str) -> Self { + self.0.name = name.to_string(); + self + } + + pub fn set_format(mut self, format: NumberFormat) -> Self { + self.0.set_format(format); + self + } + + pub fn scale(mut self, scale: u32) -> Self { + self.0.scale = scale; + self + } + + pub fn positive(mut self, positive: bool) -> Self { + self.0.sign_positive = positive; + self + } +} + +impl TypeOptionsBuilder for NumberTypeOptionsBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn build(&self) -> String { + self.0.clone().into() + } +} + +// Date +#[derive(Default)] +pub struct DateTypeOptionsBuilder(DateDescription); +impl DateTypeOptionsBuilder { + pub fn date_format(mut self, date_format: DateFormat) -> Self { + self.0.date_format = date_format; + self + } + + pub fn time_format(mut self, time_format: TimeFormat) -> Self { + self.0.time_format = time_format; + self + } +} +impl TypeOptionsBuilder for DateTypeOptionsBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn build(&self) -> String { + self.0.clone().into() + } +} + +// Single Select +#[derive(Default)] +pub struct SingleSelectTypeOptionsBuilder(SingleSelectDescription); + +impl SingleSelectTypeOptionsBuilder { + pub fn option(mut self, opt: SelectOption) -> Self { + self.0.options.push(opt); + self + } +} +impl TypeOptionsBuilder for SingleSelectTypeOptionsBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn build(&self) -> String { + self.0.clone().into() + } +} + +// Multi Select +#[derive(Default)] +pub struct MultiSelectTypeOptionsBuilder(MultiSelectDescription); + +impl MultiSelectTypeOptionsBuilder { + pub fn option(mut self, opt: SelectOption) -> Self { + self.0.options.push(opt); + self + } +} + +impl TypeOptionsBuilder for MultiSelectTypeOptionsBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn build(&self) -> String { + self.0.clone().into() + } +} + +// Checkbox +#[derive(Default)] +pub struct CheckboxTypeOptionsBuilder(CheckboxDescription); +impl CheckboxTypeOptionsBuilder { + pub fn set_selected(mut self, is_selected: bool) -> Self { + self.0.is_selected = is_selected; + self + } +} +impl TypeOptionsBuilder for CheckboxTypeOptionsBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn build(&self) -> String { + self.0.clone().into() + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/checkbox_description.rs b/frontend/rust-lib/flowy-grid/src/services/cell/description/checkbox_description.rs new file mode 100644 index 0000000000..87bd7f848c --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/cell/description/checkbox_description.rs @@ -0,0 +1,60 @@ +use crate::impl_from_and_to_type_option; +use crate::services::row::CellDataSerde; +use flowy_derive::ProtoBuf; +use flowy_error::FlowyError; +use flowy_grid_data_model::entities::{FieldMeta, FieldType}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize, Default, ProtoBuf)] +pub struct CheckboxDescription { + #[pb(index = 1)] + pub is_selected: bool, +} +impl_from_and_to_type_option!(CheckboxDescription, FieldType::Checkbox); + +impl CellDataSerde for CheckboxDescription { + fn deserialize_cell_data(&self, data: String) -> String { + data + } + + fn serialize_cell_data(&self, data: &str) -> Result { + let s = match string_to_bool(data) { + true => "1", + false => "0", + }; + Ok(s.to_owned()) + } +} + +fn string_to_bool(bool_str: &str) -> bool { + let lower_case_str: &str = &bool_str.to_lowercase(); + match lower_case_str { + "1" => true, + "true" => true, + "yes" => true, + "0" => false, + "false" => false, + "no" => false, + _ => false, + } +} + +#[cfg(test)] +mod tests { + use crate::services::cell::CheckboxDescription; + use crate::services::row::CellDataSerde; + + #[test] + fn checkout_box_description_test() { + let description = CheckboxDescription::default(); + assert_eq!(description.serialize_cell_data("true").unwrap(), "1".to_owned()); + assert_eq!(description.serialize_cell_data("1").unwrap(), "1".to_owned()); + assert_eq!(description.serialize_cell_data("yes").unwrap(), "1".to_owned()); + + assert_eq!(description.serialize_cell_data("false").unwrap(), "0".to_owned()); + assert_eq!(description.serialize_cell_data("no").unwrap(), "0".to_owned()); + assert_eq!(description.serialize_cell_data("123").unwrap(), "0".to_owned()); + + assert_eq!(description.deserialize_cell_data("1".to_owned()), "1".to_owned()); + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/date_description.rs b/frontend/rust-lib/flowy-grid/src/services/cell/description/date_description.rs new file mode 100644 index 0000000000..30af0fb160 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/cell/description/date_description.rs @@ -0,0 +1,239 @@ +use crate::impl_from_and_to_type_option; +use crate::services::row::CellDataSerde; + +use chrono::format::strftime::StrftimeItems; +use chrono::NaiveDateTime; +use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; +use flowy_error::FlowyError; +use flowy_grid_data_model::entities::{FieldMeta, FieldType}; +use serde::{Deserialize, Serialize}; + +use strum_macros::EnumIter; + +// Date +#[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] +pub struct DateDescription { + #[pb(index = 1)] + pub date_format: DateFormat, + + #[pb(index = 2)] + pub time_format: TimeFormat, +} +impl_from_and_to_type_option!(DateDescription, FieldType::DateTime); + +impl DateDescription { + #[allow(dead_code)] + fn today_from_timestamp(&self, timestamp: i64) -> String { + let native = chrono::NaiveDateTime::from_timestamp(timestamp, 0); + self.today_from_native(native) + } + + fn today_from_native(&self, naive: chrono::NaiveDateTime) -> String { + let utc: chrono::DateTime = chrono::DateTime::from_utc(naive, chrono::Utc); + let local: chrono::DateTime = chrono::DateTime::from(utc); + + let fmt_str = format!("{} {}", self.date_format.format_str(), self.time_format.format_str()); + let output = format!("{}", local.format_with_items(StrftimeItems::new(&fmt_str))); + output + } +} + +impl CellDataSerde for DateDescription { + fn deserialize_cell_data(&self, data: String) -> String { + match data.parse::() { + Ok(timestamp) => { + let native = NaiveDateTime::from_timestamp(timestamp, 0); + self.today_from_native(native) + } + Err(e) => { + tracing::debug!("DateDescription format {} fail. error: {:?}", data, e); + String::new() + } + } + } + + fn serialize_cell_data(&self, data: &str) -> Result { + if let Err(e) = data.parse::() { + tracing::error!("Parse {} to i64 failed: {}", data, e); + return Err(FlowyError::internal().context(e)); + }; + Ok(data.to_owned()) + } +} + +#[derive(Clone, Debug, Copy, EnumIter, Serialize, Deserialize, ProtoBuf_Enum)] +pub enum DateFormat { + Local = 0, + US = 1, + ISO = 2, + Friendly = 3, +} +impl std::default::Default for DateFormat { + fn default() -> Self { + DateFormat::Friendly + } +} + +impl std::convert::From for DateFormat { + fn from(value: i32) -> Self { + match value { + 0 => DateFormat::Local, + 1 => DateFormat::US, + 2 => DateFormat::ISO, + 3 => DateFormat::Friendly, + _ => { + tracing::error!("Unsupported date format, fallback to friendly"); + DateFormat::Friendly + } + } + } +} + +impl DateFormat { + pub fn value(&self) -> i32 { + *self as i32 + } + // https://docs.rs/chrono/0.4.19/chrono/format/strftime/index.html + pub fn format_str(&self) -> &'static str { + match self { + DateFormat::Local => "%Y/%m/%d", + DateFormat::US => "%Y/%m/%d", + DateFormat::ISO => "%Y-%m-%d", + DateFormat::Friendly => "%b %d,%Y", + } + } +} + +#[derive(Clone, Copy, PartialEq, Eq, EnumIter, Debug, Hash, Serialize, Deserialize, ProtoBuf_Enum)] +pub enum TimeFormat { + TwelveHour = 0, + TwentyFourHour = 1, +} + +impl std::convert::From for TimeFormat { + fn from(value: i32) -> Self { + match value { + 0 => TimeFormat::TwelveHour, + 1 => TimeFormat::TwentyFourHour, + _ => { + tracing::error!("Unsupported time format, fallback to TwentyFourHour"); + TimeFormat::TwentyFourHour + } + } + } +} + +impl TimeFormat { + pub fn value(&self) -> i32 { + *self as i32 + } + + // https://docs.rs/chrono/0.4.19/chrono/format/strftime/index.html + pub fn format_str(&self) -> &'static str { + match self { + TimeFormat::TwelveHour => "%r", + TimeFormat::TwentyFourHour => "%R", + } + } +} + +impl std::default::Default for TimeFormat { + fn default() -> Self { + TimeFormat::TwentyFourHour + } +} + +#[cfg(test)] +mod tests { + use crate::services::cell::{DateDescription, DateFormat, TimeFormat}; + use crate::services::row::CellDataSerde; + use strum::IntoEnumIterator; + + #[test] + fn date_description_date_format_test() { + let mut description = DateDescription::default(); + let _timestamp = 1647251762; + + for date_format in DateFormat::iter() { + description.date_format = date_format; + match date_format { + DateFormat::Friendly => { + assert_eq!( + "Mar 14,2022 17:56".to_owned(), + description.today_from_timestamp(1647251762) + ); + assert_eq!( + "Mar 14,2022 17:56".to_owned(), + description.deserialize_cell_data("1647251762".to_owned()) + ); + } + DateFormat::US => { + assert_eq!( + "2022/03/14 17:56".to_owned(), + description.today_from_timestamp(1647251762) + ); + assert_eq!( + "2022/03/14 17:56".to_owned(), + description.deserialize_cell_data("1647251762".to_owned()) + ); + } + DateFormat::ISO => { + assert_eq!( + "2022-03-14 17:56".to_owned(), + description.today_from_timestamp(1647251762) + ); + assert_eq!( + "2022-03-14 17:56".to_owned(), + description.deserialize_cell_data("1647251762".to_owned()) + ); + } + DateFormat::Local => { + assert_eq!( + "2022/03/14 17:56".to_owned(), + description.today_from_timestamp(1647251762) + ); + assert_eq!( + "2022/03/14 17:56".to_owned(), + description.deserialize_cell_data("1647251762".to_owned()) + ); + } + } + } + } + + #[test] + fn date_description_time_format_test() { + let mut description = DateDescription::default(); + for time_format in TimeFormat::iter() { + description.time_format = time_format; + match time_format { + TimeFormat::TwentyFourHour => { + assert_eq!( + "Mar 14,2022 17:56".to_owned(), + description.today_from_timestamp(1647251762) + ); + assert_eq!( + "Mar 14,2022 17:56".to_owned(), + description.deserialize_cell_data("1647251762".to_owned()) + ); + } + TimeFormat::TwelveHour => { + assert_eq!( + "Mar 14,2022 05:56:02 PM".to_owned(), + description.today_from_timestamp(1647251762) + ); + assert_eq!( + "Mar 14,2022 05:56:02 PM".to_owned(), + description.deserialize_cell_data("1647251762".to_owned()) + ); + } + } + } + } + + #[test] + fn date_description_invalid_data_test() { + let description = DateDescription::default(); + description.serialize_cell_data("he").unwrap(); + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/mod.rs b/frontend/rust-lib/flowy-grid/src/services/cell/description/mod.rs new file mode 100644 index 0000000000..faadd45f8c --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/cell/description/mod.rs @@ -0,0 +1,11 @@ +mod checkbox_description; +mod date_description; +mod number_description; +mod selection_description; +mod text_description; + +pub use checkbox_description::*; +pub use date_description::*; +pub use number_description::*; +pub use selection_description::*; +pub use text_description::*; diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/number_description.rs b/frontend/rust-lib/flowy-grid/src/services/cell/description/number_description.rs new file mode 100644 index 0000000000..c3468786df --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/cell/description/number_description.rs @@ -0,0 +1,269 @@ +use crate::impl_from_and_to_type_option; +use crate::services::row::CellDataSerde; +use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; +use flowy_error::FlowyError; +use flowy_grid_data_model::entities::{FieldMeta, FieldType}; +use lazy_static::lazy_static; +use rust_decimal::prelude::Zero; +use rust_decimal::Decimal; +use rusty_money::iso::{Currency, CNY, EUR, USD}; +use serde::{Deserialize, Serialize}; + +use std::str::FromStr; +use strum::IntoEnumIterator; +use strum_macros::EnumIter; + +lazy_static! { + static ref STRIP_SYMBOL: Vec = make_strip_symbol(); +} + +#[derive(Clone, Copy, Debug, EnumIter, Serialize, Deserialize, ProtoBuf_Enum)] +pub enum NumberFormat { + Number = 0, + USD = 1, + CNY = 2, + EUR = 3, +} + +impl std::default::Default for NumberFormat { + fn default() -> Self { + NumberFormat::Number + } +} + +impl NumberFormat { + pub fn symbol(&self) -> String { + match self { + NumberFormat::Number => "".to_string(), + NumberFormat::USD => USD.symbol.to_string(), + NumberFormat::CNY => CNY.symbol.to_string(), + NumberFormat::EUR => EUR.symbol.to_string(), + } + } + + #[allow(dead_code)] + pub fn code(&self) -> String { + match self { + NumberFormat::Number => "".to_string(), + NumberFormat::USD => USD.iso_alpha_code.to_string(), + NumberFormat::CNY => CNY.iso_alpha_code.to_string(), + NumberFormat::EUR => EUR.iso_alpha_code.to_string(), + } + } +} + +// Number +#[derive(Clone, Debug, Serialize, Deserialize, ProtoBuf)] +pub struct NumberDescription { + #[pb(index = 1)] + pub format: NumberFormat, + + #[pb(index = 2)] + pub scale: u32, + + #[pb(index = 3)] + pub symbol: String, + + #[pb(index = 4)] + pub sign_positive: bool, + + #[pb(index = 5)] + pub name: String, +} +impl_from_and_to_type_option!(NumberDescription, FieldType::Number); + +impl std::default::Default for NumberDescription { + fn default() -> Self { + let format = NumberFormat::default(); + let symbol = format.symbol(); + NumberDescription { + format, + scale: 0, + symbol, + sign_positive: true, + name: "Number".to_string(), + } + } +} + +impl NumberDescription { + pub fn set_format(&mut self, format: NumberFormat) { + self.format = format; + self.symbol = format.symbol(); + } + + fn decimal_from_str(&self, s: &str) -> Decimal { + let mut decimal = Decimal::from_str(s).unwrap_or_else(|_| Decimal::zero()); + match decimal.set_scale(self.scale) { + Ok(_) => {} + Err(e) => { + tracing::error!("Set decimal scale failed: {:?}", e); + } + } + decimal.set_sign_positive(self.sign_positive); + decimal + } + + fn money_from_str(&self, s: &str, currency: &'static Currency) -> String { + let decimal = self.decimal_from_str(s); + let money = rusty_money::Money::from_decimal(decimal, currency); + money.to_string() + } + + fn strip_symbol(&self, s: &str) -> String { + let mut s = String::from(s); + if !s.chars().all(char::is_numeric) { + s.retain(|c| !STRIP_SYMBOL.contains(&c.to_string())); + } + s + } +} + +impl CellDataSerde for NumberDescription { + fn deserialize_cell_data(&self, data: String) -> String { + match self.format { + NumberFormat::Number => data, + NumberFormat::USD => self.money_from_str(&data, USD), + NumberFormat::CNY => self.money_from_str(&data, CNY), + NumberFormat::EUR => self.money_from_str(&data, EUR), + } + } + + fn serialize_cell_data(&self, data: &str) -> Result { + let data = self.strip_symbol(data); + + if !data.chars().all(char::is_numeric) { + return Err(FlowyError::invalid_data().context("Should only contain numbers")); + } + Ok(data) + } +} + +fn make_strip_symbol() -> Vec { + let mut symbols = vec![",".to_owned(), ".".to_owned()]; + for format in NumberFormat::iter() { + symbols.push(format.symbol()); + } + symbols +} + +#[cfg(test)] +mod tests { + use crate::services::cell::{NumberDescription, NumberFormat}; + use crate::services::row::CellDataSerde; + use strum::IntoEnumIterator; + + #[test] + fn number_description_test() { + let mut description = NumberDescription::default(); + assert_eq!(description.serialize_cell_data("¥18,443").unwrap(), "18443".to_owned()); + assert_eq!(description.serialize_cell_data("$18,443").unwrap(), "18443".to_owned()); + assert_eq!(description.serialize_cell_data("€18.443").unwrap(), "18443".to_owned()); + + for format in NumberFormat::iter() { + description.format = format; + match format { + NumberFormat::Number => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "18443".to_owned() + ); + } + NumberFormat::USD => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "$18,443".to_owned() + ); + } + NumberFormat::CNY => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "¥18,443".to_owned() + ); + } + NumberFormat::EUR => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "€18.443".to_owned() + ); + } + } + } + } + + #[test] + fn number_description_scale_test() { + let mut description = NumberDescription { + scale: 1, + ..Default::default() + }; + + for format in NumberFormat::iter() { + description.format = format; + match format { + NumberFormat::Number => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "18443".to_owned() + ); + } + NumberFormat::USD => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "$1,844.3".to_owned() + ); + } + NumberFormat::CNY => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "¥1,844.3".to_owned() + ); + } + NumberFormat::EUR => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "€1.844,3".to_owned() + ); + } + } + } + } + + #[test] + fn number_description_sign_test() { + let mut description = NumberDescription { + sign_positive: false, + ..Default::default() + }; + + for format in NumberFormat::iter() { + description.format = format; + match format { + NumberFormat::Number => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "18443".to_owned() + ); + } + NumberFormat::USD => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "-$18,443".to_owned() + ); + } + NumberFormat::CNY => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "-¥18,443".to_owned() + ); + } + NumberFormat::EUR => { + assert_eq!( + description.deserialize_cell_data("18443".to_owned()), + "-€18.443".to_owned() + ); + } + } + } + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/selection_description.rs b/frontend/rust-lib/flowy-grid/src/services/cell/description/selection_description.rs new file mode 100644 index 0000000000..0115e390dd --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/cell/description/selection_description.rs @@ -0,0 +1,126 @@ +use crate::impl_from_and_to_type_option; +use crate::services::row::CellDataSerde; +use crate::services::util::*; +use flowy_derive::ProtoBuf; +use flowy_error::{FlowyError, FlowyResult}; +use flowy_grid_data_model::entities::{FieldMeta, FieldType}; +use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +pub const SELECTION_IDS_SEPARATOR: &str = ","; + +// Single select +#[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] +pub struct SingleSelectDescription { + #[pb(index = 1)] + pub options: Vec, + + #[pb(index = 2)] + pub disable_color: bool, +} +impl_from_and_to_type_option!(SingleSelectDescription, FieldType::SingleSelect); + +impl CellDataSerde for SingleSelectDescription { + fn deserialize_cell_data(&self, data: String) -> String { + data + } + + fn serialize_cell_data(&self, data: &str) -> Result { + single_select_option_id_from_data(data.to_owned()) + } +} + +// Multiple select +#[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] +pub struct MultiSelectDescription { + #[pb(index = 1)] + pub options: Vec, + + #[pb(index = 2)] + pub disable_color: bool, +} +impl_from_and_to_type_option!(MultiSelectDescription, FieldType::MultiSelect); +impl CellDataSerde for MultiSelectDescription { + fn deserialize_cell_data(&self, data: String) -> String { + data + } + + fn serialize_cell_data(&self, data: &str) -> Result { + multi_select_option_id_from_data(data.to_owned()) + } +} + +fn single_select_option_id_from_data(data: String) -> FlowyResult { + let select_option_ids = select_option_ids(data)?; + if select_option_ids.is_empty() { + return Ok("".to_owned()); + } + + Ok(select_option_ids.split_first().unwrap().0.to_string()) +} + +fn multi_select_option_id_from_data(data: String) -> FlowyResult { + let select_option_ids = select_option_ids(data)?; + Ok(select_option_ids.join(SELECTION_IDS_SEPARATOR)) +} + +fn select_option_ids(mut data: String) -> FlowyResult> { + data.retain(|c| !c.is_whitespace()); + let select_option_ids = data.split(SELECTION_IDS_SEPARATOR).collect::>(); + if select_option_ids + .par_iter() + .find_first(|option_id| match Uuid::parse_str(option_id) { + Ok(_) => false, + Err(e) => { + tracing::error!("{}", e); + true + } + }) + .is_some() + { + let msg = format!( + "Invalid selection id string: {}. It should consist of the uuid string and separated by comma", + data + ); + return Err(FlowyError::internal().context(msg)); + } + Ok(select_option_ids.iter().map(|id| id.to_string()).collect::>()) +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] +pub struct SelectOption { + #[pb(index = 1)] + pub id: String, + + #[pb(index = 2)] + pub name: String, + + #[pb(index = 3)] + pub color: String, +} + +impl SelectOption { + pub fn new(name: &str) -> Self { + SelectOption { + id: uuid(), + name: name.to_owned(), + color: "".to_string(), + } + } +} + +#[cfg(test)] +mod tests { + use crate::services::cell::{MultiSelectDescription, SingleSelectDescription}; + use crate::services::row::CellDataSerde; + + #[test] + fn selection_description_test() { + let description = SingleSelectDescription::default(); + assert_eq!(description.serialize_cell_data("1,2,3").unwrap(), "1".to_owned()); + + let description = MultiSelectDescription::default(); + assert_eq!(description.serialize_cell_data("1,2,3").unwrap(), "1,2,3".to_owned()); + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/text_description.rs b/frontend/rust-lib/flowy-grid/src/services/cell/description/text_description.rs new file mode 100644 index 0000000000..539b82402c --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/cell/description/text_description.rs @@ -0,0 +1,29 @@ +use crate::impl_from_and_to_type_option; +use crate::services::row::CellDataSerde; + +use flowy_derive::ProtoBuf; +use flowy_error::FlowyError; +use flowy_grid_data_model::entities::{FieldMeta, FieldType}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf)] +pub struct RichTextDescription { + #[pb(index = 1)] + pub format: String, +} +impl_from_and_to_type_option!(RichTextDescription, FieldType::RichText); + +impl CellDataSerde for RichTextDescription { + fn deserialize_cell_data(&self, data: String) -> String { + data + } + + fn serialize_cell_data(&self, data: &str) -> Result { + let data = data.to_owned(); + if data.len() > 10000 { + Err(FlowyError::text_too_long().context("The len of the text should not be more than 10000")) + } else { + Ok(data) + } + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/mod.rs b/frontend/rust-lib/flowy-grid/src/services/cell/mod.rs new file mode 100644 index 0000000000..0c28db7789 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/cell/mod.rs @@ -0,0 +1,5 @@ +mod builder; +mod description; + +pub use builder::*; +pub use description::*; diff --git a/frontend/rust-lib/flowy-grid/src/services/cell_data.rs b/frontend/rust-lib/flowy-grid/src/services/cell_data.rs deleted file mode 100644 index ce65fb005a..0000000000 --- a/frontend/rust-lib/flowy-grid/src/services/cell_data.rs +++ /dev/null @@ -1,459 +0,0 @@ -#![allow(clippy::upper_case_acronyms)] -use crate::impl_any_data; -use crate::services::util::*; -use bytes::Bytes; -use chrono::format::strftime::StrftimeItems; -use chrono::NaiveDateTime; -use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; -use flowy_error::FlowyError; -use flowy_grid_data_model::entities::{AnyData, Field, FieldType}; -use rust_decimal::Decimal; -use rusty_money::{ - iso::{Currency, CNY, EUR, USD}, - Money, -}; -use std::str::FromStr; -use strum_macros::EnumIter; - -pub trait StringifyAnyData { - fn stringify_any_data(&self, data: AnyData) -> String; - fn str_to_any_data(&self, s: &str) -> Result; -} - -pub trait DisplayCell { - fn display_content(&self, s: &str) -> String; -} - -#[derive(Debug, Clone, ProtoBuf, Default)] -pub struct RichTextDescription { - #[pb(index = 1)] - pub format: String, -} -impl_any_data!(RichTextDescription, FieldType::RichText); - -impl StringifyAnyData for RichTextDescription { - fn stringify_any_data(&self, data: AnyData) -> String { - data.to_string() - } - - fn str_to_any_data(&self, s: &str) -> Result { - Ok(AnyData::from_str(&RichTextDescription::field_type(), s)) - } -} - -impl DisplayCell for RichTextDescription { - fn display_content(&self, s: &str) -> String { - s.to_string() - } -} - -// Checkbox -#[derive(Debug, ProtoBuf, Default)] -pub struct CheckboxDescription { - #[pb(index = 1)] - pub is_selected: bool, -} -impl_any_data!(CheckboxDescription, FieldType::Checkbox); - -impl StringifyAnyData for CheckboxDescription { - fn stringify_any_data(&self, data: AnyData) -> String { - data.to_string() - } - - fn str_to_any_data(&self, s: &str) -> Result { - let s = match string_to_bool(s) { - true => "1", - false => "0", - }; - Ok(AnyData::from_str(&CheckboxDescription::field_type(), s)) - } -} - -impl DisplayCell for CheckboxDescription { - fn display_content(&self, s: &str) -> String { - s.to_string() - } -} - -// Date -#[derive(Clone, Debug, ProtoBuf, Default)] -pub struct DateDescription { - #[pb(index = 1)] - pub date_format: DateFormat, - - #[pb(index = 2)] - pub time_format: TimeFormat, -} -impl_any_data!(DateDescription, FieldType::DateTime); - -impl DateDescription { - fn date_time_format_str(&self) -> String { - format!("{} {}", self.date_format.format_str(), self.time_format.format_str()) - } - - #[allow(dead_code)] - fn today_from_timestamp(&self, timestamp: i64) -> String { - let native = chrono::NaiveDateTime::from_timestamp(timestamp, 0); - self.today_from_native(native) - } - - fn today_from_native(&self, naive: chrono::NaiveDateTime) -> String { - let utc: chrono::DateTime = chrono::DateTime::from_utc(naive, chrono::Utc); - let local: chrono::DateTime = chrono::DateTime::from(utc); - - let fmt_str = self.date_time_format_str(); - let output = format!("{}", local.format_with_items(StrftimeItems::new(&fmt_str))); - output - } -} - -impl DisplayCell for DateDescription { - fn display_content(&self, s: &str) -> String { - match s.parse::() { - Ok(timestamp) => { - let native = NaiveDateTime::from_timestamp(timestamp, 0); - self.today_from_native(native) - } - Err(e) => { - tracing::debug!("DateDescription format {} fail. error: {:?}", s, e); - String::new() - } - } - } -} - -impl StringifyAnyData for DateDescription { - fn stringify_any_data(&self, data: AnyData) -> String { - match String::from_utf8(data.value) { - Ok(s) => match s.parse::() { - Ok(timestamp) => { - let native = NaiveDateTime::from_timestamp(timestamp, 0); - self.today_from_native(native) - } - Err(e) => { - tracing::debug!("DateDescription format {} fail. error: {:?}", s, e); - String::new() - } - }, - Err(e) => { - tracing::error!("DateDescription stringify any_data failed. {:?}", e); - String::new() - } - } - } - - fn str_to_any_data(&self, s: &str) -> Result { - let timestamp = s - .parse::() - .map_err(|e| FlowyError::internal().context(format!("Parse {} to i64 failed: {}", s, e)))?; - Ok(AnyData::from_str( - &DateDescription::field_type(), - &format!("{}", timestamp), - )) - } -} - -#[derive(Clone, Debug, Copy, ProtoBuf_Enum)] -pub enum DateFormat { - Local = 0, - US = 1, - ISO = 2, - Friendly = 3, -} -impl std::default::Default for DateFormat { - fn default() -> Self { - DateFormat::Friendly - } -} - -impl std::convert::From for DateFormat { - fn from(value: i32) -> Self { - match value { - 0 => DateFormat::Local, - 1 => DateFormat::US, - 2 => DateFormat::ISO, - 3 => DateFormat::Friendly, - _ => { - tracing::error!("Unsupported date format, fallback to friendly"); - DateFormat::Friendly - } - } - } -} - -impl DateFormat { - pub fn value(&self) -> i32 { - *self as i32 - } - // https://docs.rs/chrono/0.4.19/chrono/format/strftime/index.html - pub fn format_str(&self) -> &'static str { - match self { - DateFormat::Local => "%Y/%m/%d", - DateFormat::US => "%Y/%m/%d", - DateFormat::ISO => "%Y-%m-%d", - DateFormat::Friendly => "%b %d,%Y", - } - } -} - -#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, ProtoBuf_Enum)] -pub enum TimeFormat { - TwelveHour = 0, - TwentyFourHour = 1, -} - -impl std::convert::From for TimeFormat { - fn from(value: i32) -> Self { - match value { - 0 => TimeFormat::TwelveHour, - 1 => TimeFormat::TwentyFourHour, - _ => { - tracing::error!("Unsupported time format, fallback to TwentyFourHour"); - TimeFormat::TwentyFourHour - } - } - } -} - -impl TimeFormat { - pub fn value(&self) -> i32 { - *self as i32 - } - - // https://docs.rs/chrono/0.4.19/chrono/format/strftime/index.html - pub fn format_str(&self) -> &'static str { - match self { - TimeFormat::TwelveHour => "%r", - TimeFormat::TwentyFourHour => "%R", - } - } -} - -impl std::default::Default for TimeFormat { - fn default() -> Self { - TimeFormat::TwentyFourHour - } -} - -// Single select -#[derive(Clone, Debug, ProtoBuf, Default)] -pub struct SingleSelect { - #[pb(index = 1)] - pub options: Vec, - - #[pb(index = 2)] - pub disable_color: bool, -} -impl_any_data!(SingleSelect, FieldType::SingleSelect); - -impl StringifyAnyData for SingleSelect { - fn stringify_any_data(&self, data: AnyData) -> String { - data.to_string() - } - - fn str_to_any_data(&self, s: &str) -> Result { - Ok(AnyData::from_str(&SingleSelect::field_type(), s)) - } -} - -impl DisplayCell for SingleSelect { - fn display_content(&self, s: &str) -> String { - s.to_string() - } -} - -// Multiple select -#[derive(Clone, Debug, ProtoBuf, Default)] -pub struct MultiSelect { - #[pb(index = 1)] - pub options: Vec, - - #[pb(index = 2)] - pub disable_color: bool, -} -impl_any_data!(MultiSelect, FieldType::MultiSelect); -impl StringifyAnyData for MultiSelect { - fn stringify_any_data(&self, data: AnyData) -> String { - data.to_string() - } - - fn str_to_any_data(&self, s: &str) -> Result { - Ok(AnyData::from_str(&MultiSelect::field_type(), s)) - } -} - -impl DisplayCell for MultiSelect { - fn display_content(&self, s: &str) -> String { - s.to_string() - } -} - -#[derive(Clone, Debug, ProtoBuf, Default)] -pub struct SelectOption { - #[pb(index = 1)] - pub id: String, - - #[pb(index = 2)] - pub name: String, - - #[pb(index = 3)] - pub color: String, -} - -impl SelectOption { - pub fn new(name: &str) -> Self { - SelectOption { - id: uuid(), - name: name.to_owned(), - color: "".to_string(), - } - } -} - -// Number -#[derive(Clone, Debug, ProtoBuf)] -pub struct NumberDescription { - #[pb(index = 1)] - pub money: FlowyMoney, - - #[pb(index = 2)] - pub scale: u32, - - #[pb(index = 3)] - pub symbol: String, - - #[pb(index = 4)] - pub sign_positive: bool, - - #[pb(index = 5)] - pub name: String, -} -impl_any_data!(NumberDescription, FieldType::Number); - -impl std::default::Default for NumberDescription { - fn default() -> Self { - NumberDescription { - money: FlowyMoney::default(), - scale: 0, - symbol: String::new(), - sign_positive: true, - name: String::new(), - } - } -} - -impl NumberDescription { - pub fn set_money(&mut self, money: FlowyMoney) { - self.money = money; - self.symbol = money.symbol(); - } - - fn money_from_str(&self, s: &str) -> Option { - match Decimal::from_str(s) { - Ok(mut decimal) => { - match decimal.set_scale(self.scale) { - Ok(_) => {} - Err(e) => { - tracing::error!("Set decimal scale failed: {:?}", e); - } - } - decimal.set_sign_positive(self.sign_positive); - Some(self.money.with_decimal(decimal).to_string()) - } - Err(e) => { - tracing::error!("Parser money from {} failed: {:?}", s, e); - None - } - } - } -} - -impl DisplayCell for NumberDescription { - fn display_content(&self, s: &str) -> String { - match self.money_from_str(s) { - Some(money_str) => money_str, - None => String::default(), - } - } -} - -impl StringifyAnyData for NumberDescription { - fn stringify_any_data(&self, data: AnyData) -> String { - match String::from_utf8(data.value) { - Ok(s) => match self.money_from_str(&s) { - Some(money_str) => money_str, - None => String::default(), - }, - Err(e) => { - tracing::error!("NumberDescription stringify any_data failed. {:?}", e); - String::new() - } - } - } - - fn str_to_any_data(&self, s: &str) -> Result { - let strip_symbol_money = strip_money_symbol(s); - let decimal = Decimal::from_str(&strip_symbol_money).map_err(|err| FlowyError::internal().context(err))?; - let money_str = decimal.to_string(); - Ok(AnyData::from_str(&NumberDescription::field_type(), &money_str)) - } -} - -#[derive(Clone, Copy, Debug, EnumIter, ProtoBuf_Enum)] -pub enum FlowyMoney { - CNY = 0, - EUR = 1, - USD = 2, -} - -impl std::default::Default for FlowyMoney { - fn default() -> Self { - FlowyMoney::USD - } -} - -impl FlowyMoney { - // Currency list https://docs.rs/rusty-money/0.4.0/rusty_money/iso/index.html - pub fn from_symbol_str(s: &str) -> FlowyMoney { - match s { - "CNY" => FlowyMoney::CNY, - "EUR" => FlowyMoney::EUR, - "USD" => FlowyMoney::USD, - _ => FlowyMoney::CNY, - } - } - - pub fn from_money(money: &rusty_money::Money) -> FlowyMoney { - FlowyMoney::from_symbol_str(&money.currency().symbol.to_string()) - } - - pub fn currency(&self) -> &'static Currency { - match self { - FlowyMoney::CNY => CNY, - FlowyMoney::EUR => EUR, - FlowyMoney::USD => USD, - } - } - - // string_to_money("¥18,443").unwrap(); - // string_to_money("$18,443").unwrap(); - // string_to_money("€18,443").unwrap(); - pub fn code(&self) -> String { - self.currency().iso_alpha_code.to_string() - } - - pub fn symbol(&self) -> String { - self.currency().symbol.to_string() - } - - pub fn zero(&self) -> Money { - let mut decimal = Decimal::new(0, 0); - decimal.set_sign_positive(true); - self.with_decimal(decimal) - } - - pub fn with_decimal(&self, decimal: Decimal) -> Money { - let money = rusty_money::Money::from_decimal(decimal, self.currency()); - money - } -} diff --git a/frontend/rust-lib/flowy-grid/src/services/field/field_builder.rs b/frontend/rust-lib/flowy-grid/src/services/field/field_builder.rs new file mode 100644 index 0000000000..15f5b805d9 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/field/field_builder.rs @@ -0,0 +1,59 @@ +use flowy_grid_data_model::entities::{FieldMeta, FieldType}; + +pub struct FieldBuilder { + field_meta: FieldMeta, + type_options_builder: Box, +} + +impl FieldBuilder { + pub fn new(type_options_builder: T) -> Self { + let field_meta = FieldMeta::new("Name", "", FieldType::RichText); + Self { + field_meta, + type_options_builder: Box::new(type_options_builder), + } + } + + pub fn name(mut self, name: &str) -> Self { + self.field_meta.name = name.to_owned(); + self + } + + pub fn desc(mut self, desc: &str) -> Self { + self.field_meta.desc = desc.to_owned(); + self + } + + pub fn field_type(mut self, field_type: FieldType) -> Self { + self.field_meta.field_type = field_type; + self + } + + pub fn visibility(mut self, visibility: bool) -> Self { + self.field_meta.visibility = visibility; + self + } + + pub fn width(mut self, width: i32) -> Self { + self.field_meta.width = width; + self + } + + pub fn frozen(mut self, frozen: bool) -> Self { + self.field_meta.frozen = frozen; + self + } + + pub fn build(mut self) -> FieldMeta { + assert_eq!(self.field_meta.field_type, self.type_options_builder.field_type()); + + let type_options = self.type_options_builder.build(); + self.field_meta.type_options = type_options; + self.field_meta + } +} + +pub trait TypeOptionsBuilder { + fn field_type(&self) -> FieldType; + fn build(&self) -> String; +} diff --git a/frontend/rust-lib/flowy-grid/src/services/field/mod.rs b/frontend/rust-lib/flowy-grid/src/services/field/mod.rs new file mode 100644 index 0000000000..50d069cf9b --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/field/mod.rs @@ -0,0 +1,3 @@ +mod field_builder; + +pub use field_builder::*; diff --git a/frontend/rust-lib/flowy-grid/src/services/grid_builder.rs b/frontend/rust-lib/flowy-grid/src/services/grid_builder.rs deleted file mode 100644 index e67d9176cd..0000000000 --- a/frontend/rust-lib/flowy-grid/src/services/grid_builder.rs +++ /dev/null @@ -1,106 +0,0 @@ -use crate::manager::GridManager; -use flowy_collaboration::client_grid::make_grid_delta; -use flowy_error::{FlowyError, FlowyResult}; -use flowy_grid_data_model::entities::{Field, FieldOrder, FieldType, Grid, RawCell, RawRow, RowOrder}; -use lib_infra::uuid; -use std::collections::HashMap; -use std::sync::Arc; - -pub struct GridBuilder { - grid_manager: Arc, - grid_id: String, - fields: Vec, - rows: Vec, -} - -impl GridBuilder { - pub fn new(grid_id: &str, grid_manager: Arc) -> Self { - Self { - grid_manager, - grid_id: grid_id.to_owned(), - fields: vec![], - rows: vec![], - } - } - - pub fn add_field(mut self, name: &str, desc: &str, field_type: FieldType) -> Self { - let field = Field { - id: uuid(), - name: name.to_string(), - desc: desc.to_string(), - field_type, - frozen: false, - width: 100, - type_options: Default::default(), - }; - self.fields.push(field); - self - } - - pub fn add_empty_row(mut self) -> Self { - let row = RawRow { - id: uuid(), - grid_id: self.grid_id.clone(), - cell_by_field_id: Default::default(), - }; - self.rows.push(row); - self - } - - pub fn add_row(mut self, cells: Vec) -> Self { - let cell_by_field_id = cells - .into_iter() - .map(|cell| (cell.id.clone(), cell)) - .collect::>(); - - let row = RawRow { - id: uuid(), - grid_id: self.grid_id.clone(), - cell_by_field_id, - }; - self.rows.push(row); - self - } - - pub fn build(self) -> FlowyResult { - let field_orders = self.fields.iter().map(FieldOrder::from).collect::>(); - - let row_orders = self.rows.iter().map(RowOrder::from).collect::>(); - - let grid = Grid { - id: self.grid_id, - field_orders: field_orders.into(), - row_orders: row_orders.into(), - }; - - // let _ = check_rows(&self.fields, &self.rows)?; - let _ = self.grid_manager.save_rows(self.rows)?; - let _ = self.grid_manager.save_fields(self.fields)?; - - let delta = make_grid_delta(&grid); - Ok(delta.to_delta_str()) - } -} - -#[allow(dead_code)] -fn check_rows(fields: &[Field], rows: &[RawRow]) -> FlowyResult<()> { - let field_ids = fields.iter().map(|field| &field.id).collect::>(); - for row in rows { - let cell_field_ids = row.cell_by_field_id.keys().into_iter().collect::>(); - if cell_field_ids != field_ids { - let msg = format!("{:?} contains invalid cells", row); - return Err(FlowyError::internal().context(msg)); - } - } - Ok(()) -} - -pub fn make_default_grid(grid_id: &str, grid_manager: Arc) -> String { - GridBuilder::new(grid_id, grid_manager) - .add_field("Name", "", FieldType::RichText) - .add_field("Tags", "", FieldType::SingleSelect) - .add_empty_row() - .add_empty_row() - .build() - .unwrap() -} diff --git a/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs b/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs index 418807e058..d1276bb8ab 100644 --- a/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs +++ b/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs @@ -1,33 +1,33 @@ use crate::manager::GridUser; -use crate::services::kv_persistence::{GridKVPersistence, KVTransaction}; -use crate::services::stringify::stringify_deserialize; - -use dashmap::DashMap; -use flowy_collaboration::client_grid::{GridChange, GridPad}; +use crate::services::block_meta_editor::GridBlockMetaEditorManager; +use bytes::Bytes; +use flowy_collaboration::client_grid::{GridChangeset, GridMetaPad}; use flowy_collaboration::entities::revision::Revision; use flowy_collaboration::util::make_delta_from_revisions; use flowy_error::{FlowyError, FlowyResult}; use flowy_grid_data_model::entities::{ - Cell, Field, Grid, RawCell, RawRow, RepeatedField, RepeatedFieldOrder, RepeatedRow, RepeatedRowOrder, Row, + CellMetaChangeset, Field, FieldChangeset, FieldMeta, Grid, GridBlockMeta, GridBlockMetaChangeset, GridBlockOrder, + RepeatedField, RepeatedFieldOrder, RepeatedGridBlock, RepeatedRow, Row, RowMeta, RowMetaChangeset, RowOrder, }; -use flowy_sync::{RevisionCloudService, RevisionCompact, RevisionManager, RevisionObjectBuilder}; -use lib_infra::future::FutureResult; -use lib_infra::uuid; -use lib_ot::core::PlainTextAttributes; - -use rayon::iter::{IntoParallelIterator, ParallelIterator}; use std::collections::HashMap; + +use crate::dart_notification::{send_dart_notification, GridNotification}; +use crate::services::row::{ + make_grid_block_from_block_metas, make_grid_blocks, make_row_meta_from_context, make_rows_from_row_metas, + serialize_cell_data, CreateRowMetaBuilder, CreateRowMetaPayload, GridBlockMetaData, +}; +use flowy_sync::{RevisionCloudService, RevisionCompactor, RevisionManager, RevisionObjectBuilder}; +use lib_infra::future::FutureResult; +use lib_ot::core::PlainTextAttributes; use std::sync::Arc; use tokio::sync::RwLock; pub struct ClientGridEditor { grid_id: String, user: Arc, - grid_pad: Arc>, + pad: Arc>, rev_manager: Arc, - kv_persistence: Arc, - - field_map: DashMap, + block_meta_manager: Arc, } impl ClientGridEditor { @@ -35,132 +35,225 @@ impl ClientGridEditor { grid_id: &str, user: Arc, mut rev_manager: RevisionManager, - kv_persistence: Arc, ) -> FlowyResult> { let token = user.token()?; let cloud = Arc::new(GridRevisionCloudService { token }); - let grid_pad = rev_manager.load::(cloud).await?; - + let grid_pad = rev_manager.load::(Some(cloud)).await?; let rev_manager = Arc::new(rev_manager); - let field_map = load_all_fields(&grid_pad, &kv_persistence).await?; - let grid_pad = Arc::new(RwLock::new(grid_pad)); + let pad = Arc::new(RwLock::new(grid_pad)); + + let block_meta_manager = + Arc::new(GridBlockMetaEditorManager::new(grid_id, &user, pad.read().await.get_blocks().clone()).await?); Ok(Arc::new(Self { grid_id: grid_id.to_owned(), user, - grid_pad, + pad, rev_manager, - kv_persistence, - field_map, + block_meta_manager, })) } - pub async fn create_empty_row(&self) -> FlowyResult<()> { - let row = RawRow { - id: uuid(), - grid_id: self.grid_id.clone(), - cell_by_field_id: Default::default(), - }; - self.create_row(row).await?; + pub async fn create_field(&self, field_meta: FieldMeta) -> FlowyResult<()> { + let _ = self.modify(|grid| Ok(grid.create_field(field_meta)?)).await?; + let _ = self.notify_did_update_fields().await?; Ok(()) } - async fn create_row(&self, row: RawRow) -> FlowyResult<()> { - let _ = self.modify(|grid| Ok(grid.create_row(&row)?)).await?; - let _ = self.kv_persistence.set(row)?; + pub async fn contain_field(&self, field_meta: &FieldMeta) -> bool { + self.pad.read().await.contain_field(&field_meta.id) + } + + pub async fn update_field(&self, change: FieldChangeset) -> FlowyResult<()> { + let _ = self.modify(|grid| Ok(grid.update_field(change)?)).await?; Ok(()) } - pub async fn delete_rows(&self, ids: Vec) -> FlowyResult<()> { - let _ = self.modify(|grid| Ok(grid.delete_rows(&ids)?)).await?; - // let _ = self.kv.batch_delete(ids)?; - Ok(()) - } - - pub async fn create_field(&mut self, field: Field) -> FlowyResult<()> { - let _ = self.modify(|grid| Ok(grid.create_field(&field)?)).await?; - let _ = self.kv_persistence.set(field)?; - Ok(()) - } - - pub async fn delete_field(&mut self, field_id: &str) -> FlowyResult<()> { + pub async fn delete_field(&self, field_id: &str) -> FlowyResult<()> { let _ = self.modify(|grid| Ok(grid.delete_field(field_id)?)).await?; - // let _ = self.kv.remove(field_id)?; Ok(()) } - pub async fn get_rows(&self, row_orders: RepeatedRowOrder) -> FlowyResult { - let ids = row_orders - .items - .into_iter() - .map(|row_order| row_order.row_id) - .collect::>(); - let raw_rows: Vec = self.kv_persistence.batch_get(ids)?; - - let make_cell = |field_id: String, raw_cell: RawCell| { - let some_field = self.field_map.get(&field_id); - if some_field.is_none() { - tracing::error!("Can't find the field with {}", field_id); - return None; - } - - let field = some_field.unwrap(); - match stringify_deserialize(raw_cell.data, field.value()) { - Ok(content) => { - let cell = Cell { - id: raw_cell.id, - field_id: field_id.clone(), - content, - }; - Some((field_id, cell)) - } - Err(_) => None, - } - }; - - let rows = raw_rows - .into_par_iter() - .map(|raw_row| { - let mut row = Row::new(&raw_row.id); - row.cell_by_field_id = raw_row - .cell_by_field_id - .into_par_iter() - .flat_map(|(field_id, raw_cell)| make_cell(field_id, raw_cell)) - .collect::>(); - row - }) - .collect::>(); - - Ok(rows.into()) + pub async fn create_block(&self, grid_block: GridBlockMeta) -> FlowyResult<()> { + let _ = self.modify(|grid| Ok(grid.create_block(grid_block)?)).await?; + Ok(()) } - pub async fn get_fields(&self, field_orders: RepeatedFieldOrder) -> FlowyResult { - let fields = field_orders - .iter() - .flat_map(|field_order| match self.field_map.get(&field_order.field_id) { + pub async fn update_block(&self, changeset: GridBlockMetaChangeset) -> FlowyResult<()> { + let _ = self.modify(|grid| Ok(grid.update_block(changeset)?)).await?; + Ok(()) + } + + pub async fn create_row(&self, start_row_id: Option) -> FlowyResult { + let field_metas = self.pad.read().await.get_field_metas(None)?; + let block_id = self.block_id().await?; + + // insert empty row below the row whose id is upper_row_id + let row_meta_ctx = CreateRowMetaBuilder::new(&field_metas).build(); + let row_meta = make_row_meta_from_context(&block_id, row_meta_ctx); + let row_order = RowOrder::from(&row_meta); + + // insert the row + let row_count = self + .block_meta_manager + .create_row(&block_id, row_meta, start_row_id) + .await?; + + // update block row count + let changeset = GridBlockMetaChangeset::from_row_count(&block_id, row_count); + let _ = self.update_block(changeset).await?; + Ok(row_order) + } + + pub async fn insert_rows(&self, contexts: Vec) -> FlowyResult> { + let block_id = self.block_id().await?; + let mut rows_by_block_id: HashMap> = HashMap::new(); + let mut row_orders = vec![]; + for ctx in contexts { + let row_meta = make_row_meta_from_context(&block_id, ctx); + row_orders.push(RowOrder::from(&row_meta)); + rows_by_block_id + .entry(block_id.clone()) + .or_insert_with(Vec::new) + .push(row_meta); + } + let changesets = self.block_meta_manager.insert_row(rows_by_block_id).await?; + for changeset in changesets { + let _ = self.update_block(changeset).await?; + } + Ok(row_orders) + } + + pub async fn update_row(&self, changeset: RowMetaChangeset) -> FlowyResult<()> { + self.block_meta_manager.update_row(changeset).await + } + + pub async fn get_rows(&self, block_id: &str) -> FlowyResult { + let block_ids = vec![block_id.to_owned()]; + let mut block_meta_data_vec = self.get_block_meta_data_vec(Some(&block_ids)).await?; + debug_assert_eq!(block_meta_data_vec.len(), 1); + if block_meta_data_vec.len() == 1 { + let block_meta_data = block_meta_data_vec.pop().unwrap(); + let field_metas = self.get_field_metas(None).await?; + let rows = make_rows_from_row_metas(&field_metas, &block_meta_data.row_metas); + Ok(rows.into()) + } else { + Ok(vec![].into()) + } + } + + pub async fn get_row(&self, block_id: &str, row_id: &str) -> FlowyResult> { + match self.block_meta_manager.get_row(block_id, row_id).await? { + None => Ok(None), + Some(row) => { + let field_metas = self.get_field_metas(None).await?; + let row_metas = vec![row]; + let mut rows = make_rows_from_row_metas(&field_metas, &row_metas); + debug_assert!(rows.len() == 1); + Ok(rows.pop()) + } + } + } + + pub async fn update_cell(&self, changeset: CellMetaChangeset) -> FlowyResult<()> { + if let Some(cell_data) = changeset.data.as_ref() { + match self.pad.read().await.get_field(&changeset.field_id) { None => { - tracing::error!("Can't find the field with {}", field_order.field_id); - None + return Err(FlowyError::internal() + .context(format!("Can not find the field with id: {}", &changeset.field_id))); } - Some(field) => Some(field.value().clone()), + Some(field_meta) => { + let _ = serialize_cell_data(cell_data, field_meta)?; + } + } + } + + let field_metas = self.get_field_metas(None).await?; + let row_changeset: RowMetaChangeset = changeset.into(); + let _ = self + .block_meta_manager + .update_cells(&field_metas, row_changeset) + .await?; + Ok(()) + } + + pub async fn get_blocks(&self, block_ids: Option>) -> FlowyResult { + let block_meta_data_vec = self.get_block_meta_data_vec(block_ids.as_ref()).await?; + match block_ids { + None => make_grid_blocks(block_meta_data_vec), + Some(block_ids) => make_grid_block_from_block_metas(&block_ids, block_meta_data_vec), + } + } + + pub async fn get_block_metas(&self) -> FlowyResult> { + let grid_blocks = self.pad.read().await.get_blocks(); + Ok(grid_blocks) + } + + pub async fn delete_rows(&self, row_orders: Vec) -> FlowyResult<()> { + let changesets = self.block_meta_manager.delete_rows(row_orders).await?; + for changeset in changesets { + let _ = self.update_block(changeset).await?; + } + Ok(()) + } + + pub async fn grid_data(&self) -> FlowyResult { + let field_orders = self.pad.read().await.get_field_orders(); + let block_orders = self + .pad + .read() + .await + .get_blocks() + .into_iter() + .map(|grid_block_meta| GridBlockOrder { + block_id: grid_block_meta.block_id, }) - .collect::>(); - Ok(fields.into()) + .collect::>(); + Ok(Grid { + id: self.grid_id.clone(), + field_orders, + block_orders, + }) } - pub async fn grid_data(&self) -> Grid { - self.grid_pad.read().await.grid_data() + pub async fn get_field_metas(&self, field_orders: Option) -> FlowyResult> { + let field_meta = self.pad.read().await.get_field_metas(field_orders)?; + Ok(field_meta) } - pub async fn delta_str(&self) -> String { - self.grid_pad.read().await.delta_str() + pub async fn get_block_meta_data_vec( + &self, + block_ids: Option<&Vec>, + ) -> FlowyResult> { + match block_ids { + None => { + let grid_blocks = self.pad.read().await.get_blocks(); + let row_metas_per_block = self + .block_meta_manager + .get_block_meta_data_from_blocks(grid_blocks) + .await?; + Ok(row_metas_per_block) + } + Some(block_ids) => { + let row_metas_per_block = self + .block_meta_manager + .get_block_meta_data(block_ids.as_slice()) + .await?; + Ok(row_metas_per_block) + } + } + } + + pub async fn delta_bytes(&self) -> Bytes { + self.pad.read().await.delta_bytes() } async fn modify(&self, f: F) -> FlowyResult<()> where - F: for<'a> FnOnce(&'a mut GridPad) -> FlowyResult>, + F: for<'a> FnOnce(&'a mut GridMetaPad) -> FlowyResult>, { - let mut write_guard = self.grid_pad.write().await; + let mut write_guard = self.pad.write().await; match f(&mut *write_guard)? { None => {} Some(change) => { @@ -170,11 +263,11 @@ impl ClientGridEditor { Ok(()) } - async fn apply_change(&self, change: GridChange) -> FlowyResult<()> { - let GridChange { delta, md5 } = change; + async fn apply_change(&self, change: GridChangeset) -> FlowyResult<()> { + let GridChangeset { delta, md5 } = change; let user_id = self.user.user_id()?; let (base_rev_id, rev_id) = self.rev_manager.next_rev_id_pair(); - let delta_data = delta.to_bytes(); + let delta_data = delta.to_delta_bytes(); let revision = Revision::new( &self.rev_manager.object_id, base_rev_id, @@ -185,36 +278,41 @@ impl ClientGridEditor { ); let _ = self .rev_manager - .add_local_revision::(&revision) + .add_local_revision(&revision, Box::new(GridRevisionCompactor())) .await?; Ok(()) } + + async fn block_id(&self) -> FlowyResult { + match self.pad.read().await.get_blocks().last() { + None => Err(FlowyError::internal().context("There is no grid block in this grid")), + Some(grid_block) => Ok(grid_block.block_id.clone()), + } + } + + async fn notify_did_update_fields(&self) -> FlowyResult<()> { + let field_metas = self.get_field_metas(None).await?; + let repeated_field: RepeatedField = field_metas.into_iter().map(Field::from).collect::>().into(); + send_dart_notification(&self.grid_id, GridNotification::GridDidUpdateFields) + .payload(repeated_field) + .send(); + Ok(()) + } } -async fn load_all_fields( - grid_pad: &GridPad, - kv_persistence: &Arc, -) -> FlowyResult> { - let field_ids = grid_pad - .field_orders() - .iter() - .map(|field_order| field_order.field_id.clone()) - .collect::>(); - - let fields = kv_persistence.batch_get::(field_ids)?; - let map = DashMap::new(); - for field in fields { - map.insert(field.id.clone(), field); +#[cfg(feature = "flowy_unit_test")] +impl ClientGridEditor { + pub fn rev_manager(&self) -> Arc { + self.rev_manager.clone() } - Ok(map) } -struct GridPadBuilder(); +pub struct GridPadBuilder(); impl RevisionObjectBuilder for GridPadBuilder { - type Output = GridPad; + type Output = GridMetaPad; fn build_object(object_id: &str, revisions: Vec) -> FlowyResult { - let pad = GridPad::from_revisions(object_id, revisions)?; + let pad = GridMetaPad::from_revisions(object_id, revisions)?; Ok(pad) } } @@ -231,24 +329,10 @@ impl RevisionCloudService for GridRevisionCloudService { } } -struct GridRevisionCompact(); -impl RevisionCompact for GridRevisionCompact { - fn compact_revisions(user_id: &str, object_id: &str, mut revisions: Vec) -> FlowyResult { - if revisions.is_empty() { - return Err(FlowyError::internal().context("Can't compact the empty folder's revisions")); - } - - if revisions.len() == 1 { - return Ok(revisions.pop().unwrap()); - } - - let first_revision = revisions.first().unwrap(); - let last_revision = revisions.last().unwrap(); - - let (base_rev_id, rev_id) = first_revision.pair_rev_id(); - let md5 = last_revision.md5.clone(); +struct GridRevisionCompactor(); +impl RevisionCompactor for GridRevisionCompactor { + fn bytes_from_revisions(&self, revisions: Vec) -> FlowyResult { let delta = make_delta_from_revisions::(revisions)?; - let delta_data = delta.to_bytes(); - Ok(Revision::new(object_id, base_rev_id, rev_id, delta_data, user_id, md5)) + Ok(delta.to_delta_bytes()) } } diff --git a/frontend/rust-lib/flowy-grid/src/services/kv_persistence.rs b/frontend/rust-lib/flowy-grid/src/services/kv_persistence.rs index bc398f9cf3..6577c52ecd 100644 --- a/frontend/rust-lib/flowy-grid/src/services/kv_persistence.rs +++ b/frontend/rust-lib/flowy-grid/src/services/kv_persistence.rs @@ -6,8 +6,6 @@ use flowy_database::{ schema::{kv_table, kv_table::dsl}, }; use flowy_error::{FlowyError, FlowyResult}; -use flowy_grid_data_model::entities::GridIdentifiable; - use lib_sqlite::ConnectionPool; use std::sync::Arc; @@ -135,33 +133,11 @@ impl<'a> KVTransaction for SqliteTransaction<'a> { } } -impl + GridIdentifiable> std::convert::From for KeyValue { - fn from(value: T) -> Self { - let key = value.id().to_string(); - let bytes: Bytes = value.try_into().unwrap(); - let value = bytes.to_vec(); - KeyValue { key, value } - } -} - -// -// impl std::convert::TryInto for KeyValue { - -// type Error = FlowyError; -// -// fn try_into(self) -> Result { -// let bytes = Bytes::from(self.value); -// RawRow::try_from(bytes) -// .map_err(|e| FlowyError::internal().context(format!("Deserialize into raw row failed: {:?}", e))) -// } -// } -// -// impl std::convert::TryInto for KeyValue { -// type Error = FlowyError; -// -// fn try_into(self) -> Result { -// let bytes = Bytes::from(self.value); -// Field::try_from(bytes) -// .map_err(|e| FlowyError::internal().context(format!("Deserialize into field failed: {:?}", e))) +// impl + GridIdentifiable> std::convert::From for KeyValue { +// fn from(value: T) -> Self { +// let key = value.id().to_string(); +// let bytes: Bytes = value.try_into().unwrap(); +// let value = bytes.to_vec(); +// KeyValue { key, value } // } // } diff --git a/frontend/rust-lib/flowy-grid/src/services/mod.rs b/frontend/rust-lib/flowy-grid/src/services/mod.rs index f1e1086589..f8b0422685 100644 --- a/frontend/rust-lib/flowy-grid/src/services/mod.rs +++ b/frontend/rust-lib/flowy-grid/src/services/mod.rs @@ -1,7 +1,8 @@ mod util; -pub mod cell_data; -pub mod grid_builder; +pub mod block_meta_editor; +pub mod cell; +pub mod field; pub mod grid_editor; pub mod kv_persistence; -pub mod stringify; +pub mod row; diff --git a/frontend/rust-lib/flowy-grid/src/services/row/cell_data_serde.rs b/frontend/rust-lib/flowy-grid/src/services/row/cell_data_serde.rs new file mode 100644 index 0000000000..148b5254ba --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/row/cell_data_serde.rs @@ -0,0 +1,32 @@ +use crate::services::cell::*; +use flowy_error::FlowyError; +use flowy_grid_data_model::entities::{FieldMeta, FieldType}; + +pub trait CellDataSerde { + fn deserialize_cell_data(&self, data: String) -> String; + fn serialize_cell_data(&self, data: &str) -> Result; +} + +#[allow(dead_code)] +pub fn serialize_cell_data(data: &str, field: &FieldMeta) -> Result { + match field.field_type { + FieldType::RichText => RichTextDescription::from(field).serialize_cell_data(data), + FieldType::Number => NumberDescription::from(field).serialize_cell_data(data), + FieldType::DateTime => DateDescription::from(field).serialize_cell_data(data), + FieldType::SingleSelect => SingleSelectDescription::from(field).serialize_cell_data(data), + FieldType::MultiSelect => MultiSelectDescription::from(field).serialize_cell_data(data), + FieldType::Checkbox => CheckboxDescription::from(field).serialize_cell_data(data), + } +} + +pub fn deserialize_cell_data(data: String, field: &FieldMeta) -> Result { + let s = match field.field_type { + FieldType::RichText => RichTextDescription::from(field).deserialize_cell_data(data), + FieldType::Number => NumberDescription::from(field).deserialize_cell_data(data), + FieldType::DateTime => DateDescription::from(field).deserialize_cell_data(data), + FieldType::SingleSelect => SingleSelectDescription::from(field).deserialize_cell_data(data), + FieldType::MultiSelect => MultiSelectDescription::from(field).deserialize_cell_data(data), + FieldType::Checkbox => CheckboxDescription::from(field).deserialize_cell_data(data), + }; + Ok(s) +} diff --git a/frontend/rust-lib/flowy-grid/src/services/row/mod.rs b/frontend/rust-lib/flowy-grid/src/services/row/mod.rs new file mode 100644 index 0000000000..fec4ea8d8c --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/row/mod.rs @@ -0,0 +1,7 @@ +mod cell_data_serde; +mod row_builder; +mod row_loader; + +pub use cell_data_serde::*; +pub use row_builder::*; +pub(crate) use row_loader::*; diff --git a/frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs b/frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs new file mode 100644 index 0000000000..cbaae78fed --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs @@ -0,0 +1,78 @@ +use crate::services::row::serialize_cell_data; +use flowy_error::{FlowyError, FlowyResult}; +use flowy_grid_data_model::entities::{CellMeta, FieldMeta, RowMeta, DEFAULT_ROW_HEIGHT}; +use std::collections::HashMap; + +pub struct CreateRowMetaBuilder<'a> { + field_meta_map: HashMap<&'a String, &'a FieldMeta>, + payload: CreateRowMetaPayload, +} + +impl<'a> CreateRowMetaBuilder<'a> { + pub fn new(fields: &'a [FieldMeta]) -> Self { + let field_meta_map = fields + .iter() + .map(|field| (&field.id, field)) + .collect::>(); + + let payload = CreateRowMetaPayload { + row_id: uuid::Uuid::new_v4().to_string(), + cell_by_field_id: Default::default(), + height: DEFAULT_ROW_HEIGHT, + visibility: true, + }; + + Self { + field_meta_map, + payload, + } + } + + pub fn add_cell(&mut self, field_id: &str, data: String) -> FlowyResult<()> { + match self.field_meta_map.get(&field_id.to_owned()) { + None => { + let msg = format!("Invalid field_id: {}", field_id); + Err(FlowyError::internal().context(msg)) + } + Some(field_meta) => { + let data = serialize_cell_data(&data, field_meta)?; + let cell = CellMeta::new(field_id, data); + self.payload.cell_by_field_id.insert(field_id.to_owned(), cell); + Ok(()) + } + } + } + + #[allow(dead_code)] + pub fn height(mut self, height: i32) -> Self { + self.payload.height = height; + self + } + + #[allow(dead_code)] + pub fn visibility(mut self, visibility: bool) -> Self { + self.payload.visibility = visibility; + self + } + + pub fn build(self) -> CreateRowMetaPayload { + self.payload + } +} + +pub fn make_row_meta_from_context(block_id: &str, payload: CreateRowMetaPayload) -> RowMeta { + RowMeta { + id: payload.row_id, + block_id: block_id.to_owned(), + cell_by_field_id: payload.cell_by_field_id, + height: payload.height, + visibility: payload.visibility, + } +} + +pub struct CreateRowMetaPayload { + pub row_id: String, + pub cell_by_field_id: HashMap, + pub height: i32, + pub visibility: bool, +} diff --git a/frontend/rust-lib/flowy-grid/src/services/row/row_loader.rs b/frontend/rust-lib/flowy-grid/src/services/row/row_loader.rs new file mode 100644 index 0000000000..bf2f62c776 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/row/row_loader.rs @@ -0,0 +1,125 @@ +use crate::services::row::deserialize_cell_data; +use flowy_error::FlowyResult; +use flowy_grid_data_model::entities::{ + Cell, CellMeta, FieldMeta, GridBlock, RepeatedGridBlock, Row, RowMeta, RowOrder, +}; +use rayon::iter::{IntoParallelIterator, ParallelIterator}; +use std::collections::HashMap; + +use std::sync::Arc; + +pub(crate) struct RowIdsPerBlock { + pub(crate) block_id: String, + pub(crate) row_ids: Vec, +} + +impl RowIdsPerBlock { + pub fn new(block_id: &str) -> Self { + RowIdsPerBlock { + block_id: block_id.to_owned(), + row_ids: vec![], + } + } +} + +pub struct GridBlockMetaData { + pub(crate) block_id: String, + pub row_metas: Vec>, +} + +pub(crate) fn make_row_ids_per_block(row_orders: &[RowOrder]) -> Vec { + let mut map: HashMap<&String, RowIdsPerBlock> = HashMap::new(); + row_orders.iter().for_each(|row_order| { + let block_id = &row_order.block_id; + let row_id = row_order.row_id.clone(); + map.entry(block_id) + .or_insert_with(|| RowIdsPerBlock::new(block_id)) + .row_ids + .push(row_id); + }); + map.into_values().collect::>() +} + +pub(crate) fn make_grid_blocks(block_meta_snapshots: Vec) -> FlowyResult { + Ok(block_meta_snapshots + .into_iter() + .map(|row_metas_per_block| { + let row_orders = make_row_orders_from_row_metas(&row_metas_per_block.row_metas); + GridBlock { + block_id: row_metas_per_block.block_id, + row_orders, + } + }) + .collect::>() + .into()) +} + +#[inline(always)] +pub fn make_cell( + field_map: &HashMap<&String, &FieldMeta>, + field_id: String, + raw_cell: CellMeta, +) -> Option<(String, Cell)> { + let field_meta = field_map.get(&field_id)?; + match deserialize_cell_data(raw_cell.data, field_meta) { + Ok(content) => { + let cell = Cell::new(&field_id, content); + Some((field_id, cell)) + } + Err(e) => { + tracing::error!("{}", e); + None + } + } +} + +pub(crate) fn make_row_orders_from_row_metas(row_metas: &[Arc]) -> Vec { + row_metas.iter().map(RowOrder::from).collect::>() +} + +pub(crate) fn make_rows_from_row_metas(fields: &[FieldMeta], row_metas: &[Arc]) -> Vec { + let field_meta_map = fields + .iter() + .map(|field_meta| (&field_meta.id, field_meta)) + .collect::>(); + + let make_row = |row_meta: &Arc| { + let cell_by_field_id = row_meta + .cell_by_field_id + .clone() + .into_par_iter() + .flat_map(|(field_id, raw_cell)| make_cell(&field_meta_map, field_id, raw_cell)) + .collect::>(); + + Row { + id: row_meta.id.clone(), + cell_by_field_id, + height: row_meta.height, + } + }; + + row_metas.iter().map(make_row).collect::>() +} + +pub(crate) fn make_grid_block_from_block_metas( + block_ids: &[String], + block_meta_data_vec: Vec, +) -> FlowyResult { + let block_meta_data_map: HashMap<&String, &Vec>> = block_meta_data_vec + .iter() + .map(|data| (&data.block_id, &data.row_metas)) + .collect(); + + let mut grid_blocks = vec![]; + for block_id in block_ids { + match block_meta_data_map.get(&block_id) { + None => {} + Some(row_metas) => { + let row_orders = make_row_orders_from_row_metas(row_metas); + grid_blocks.push(GridBlock::new(block_id, row_orders)); + } + } + } + + Ok(grid_blocks.into()) +} diff --git a/frontend/rust-lib/flowy-grid/src/services/stringify.rs b/frontend/rust-lib/flowy-grid/src/services/stringify.rs deleted file mode 100644 index a9154a5809..0000000000 --- a/frontend/rust-lib/flowy-grid/src/services/stringify.rs +++ /dev/null @@ -1,29 +0,0 @@ -use crate::services::cell_data::*; -use crate::services::util::*; -use flowy_error::FlowyError; -use flowy_grid_data_model::entities::{AnyData, Field, FieldType}; - -#[allow(dead_code)] -pub fn stringify_serialize(field: &Field, s: &str) -> Result { - match field.field_type { - FieldType::RichText => RichTextDescription::from(field).str_to_any_data(s), - FieldType::Number => NumberDescription::from(field).str_to_any_data(s), - FieldType::DateTime => DateDescription::from(field).str_to_any_data(s), - FieldType::SingleSelect => SingleSelect::from(field).str_to_any_data(s), - FieldType::MultiSelect => MultiSelect::from(field).str_to_any_data(s), - FieldType::Checkbox => CheckboxDescription::from(field).str_to_any_data(s), - } -} - -pub(crate) fn stringify_deserialize(data: AnyData, field: &Field) -> Result { - let _ = check_type_id(&data, field)?; - let s = match field.field_type { - FieldType::RichText => RichTextDescription::from(field).stringify_any_data(data), - FieldType::Number => NumberDescription::from(field).stringify_any_data(data), - FieldType::DateTime => DateDescription::from(field).stringify_any_data(data), - FieldType::SingleSelect => SingleSelect::from(field).stringify_any_data(data), - FieldType::MultiSelect => MultiSelect::from(field).stringify_any_data(data), - FieldType::Checkbox => CheckboxDescription::from(field).stringify_any_data(data), - }; - Ok(s) -} diff --git a/frontend/rust-lib/flowy-grid/src/services/util.rs b/frontend/rust-lib/flowy-grid/src/services/util.rs index 8fa196956d..7370a1b19c 100644 --- a/frontend/rust-lib/flowy-grid/src/services/util.rs +++ b/frontend/rust-lib/flowy-grid/src/services/util.rs @@ -1,129 +1,3 @@ -use crate::services::cell_data::FlowyMoney; -use flowy_error::FlowyError; -use flowy_grid_data_model::entities::{AnyData, Field, FieldType}; -use lazy_static::lazy_static; -use rust_decimal::Decimal; -use rusty_money::{iso::Currency, Money}; -use std::collections::HashMap; -use std::str::FromStr; -use strum::IntoEnumIterator; - -lazy_static! { - static ref CURRENCIES_BY_SYMBOL: HashMap = generate_currency_by_symbol(); -} - -#[allow(dead_code)] -fn generate_currency_by_symbol() -> HashMap { - let mut map: HashMap = HashMap::new(); - - for money in FlowyMoney::iter() { - map.insert(money.symbol(), money.currency()); - } - map -} - -#[allow(dead_code)] -pub fn string_to_money(money_str: &str) -> Option> { - let mut process_money_str = String::from(money_str); - let default_currency = FlowyMoney::from_symbol_str("CNY").currency(); - - if process_money_str.is_empty() { - return None; - } - - return if process_money_str.chars().all(char::is_numeric) { - match Money::from_str(&process_money_str, default_currency) { - Ok(money) => Some(money), - Err(_) => None, - } - } else { - let symbol = process_money_str.chars().next().unwrap().to_string(); - let mut currency = default_currency; - - for key in CURRENCIES_BY_SYMBOL.keys() { - if symbol.eq(key) { - currency = CURRENCIES_BY_SYMBOL.get(key).unwrap(); - crop_letters(&mut process_money_str, 1); - } - } - - match Money::from_str(&process_money_str, currency) { - Ok(money) => Some(money), - Err(_) => None, - } - }; -} - -#[allow(dead_code)] -pub fn money_from_str(s: &str) -> Option { - match Decimal::from_str(s) { - Ok(mut decimal) => { - match decimal.set_scale(0) { - Ok(_) => {} - Err(e) => { - tracing::error!("Set scale failed. {:?}", e); - } - } - decimal.set_sign_positive(true); - Some(FlowyMoney::USD.with_decimal(decimal).to_string()) - } - Err(e) => { - tracing::debug!("Format {} to money failed, {:?}", s, e); - None - } - } -} - -pub fn strip_money_symbol(money_str: &str) -> String { - let mut process_money_str = String::from(money_str); - - if !process_money_str.chars().all(char::is_numeric) { - let symbol = process_money_str.chars().next().unwrap().to_string(); - for key in CURRENCIES_BY_SYMBOL.keys() { - if symbol.eq(key) { - crop_letters(&mut process_money_str, 1); - } - } - } - process_money_str -} - -fn crop_letters(s: &mut String, pos: usize) { - match s.char_indices().nth(pos) { - Some((pos, _)) => { - s.drain(..pos); - } - None => { - s.clear(); - } - } -} - -pub fn string_to_bool(bool_str: &str) -> bool { - let lower_case_str: &str = &bool_str.to_lowercase(); - match lower_case_str { - "1" => true, - "true" => true, - "yes" => true, - "0" => false, - "false" => false, - "no" => false, - _ => false, - } -} - pub fn uuid() -> String { uuid::Uuid::new_v4().to_string() } - -pub fn check_type_id(data: &AnyData, field: &Field) -> Result<(), FlowyError> { - let field_type = FieldType::from_type_id(&data.type_id).map_err(|e| FlowyError::internal().context(e))?; - if field_type != field.field_type { - tracing::error!( - "expected field type: {:?} but receive {:?} ", - field_type, - field.field_type - ); - } - Ok(()) -} diff --git a/frontend/rust-lib/flowy-grid/src/util.rs b/frontend/rust-lib/flowy-grid/src/util.rs new file mode 100644 index 0000000000..82d5399f9e --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/util.rs @@ -0,0 +1,31 @@ +use crate::services::cell::*; +use crate::services::field::*; +use flowy_collaboration::client_grid::GridBuilder; +use flowy_grid_data_model::entities::{BuildGridContext, FieldType}; + +pub fn make_default_grid() -> BuildGridContext { + let text_field = FieldBuilder::new(RichTextTypeOptionsBuilder::default()) + .name("Name") + .visibility(true) + .field_type(FieldType::RichText) + .build(); + + let single_select = SingleSelectTypeOptionsBuilder::default() + .option(SelectOption::new("Done")) + .option(SelectOption::new("Unknown")) + .option(SelectOption::new("Progress")); + + let single_select_field = FieldBuilder::new(single_select) + .name("Status") + .visibility(true) + .field_type(FieldType::SingleSelect) + .build(); + + GridBuilder::default() + .add_field(text_field) + .add_field(single_select_field) + .add_empty_row() + .add_empty_row() + .add_empty_row() + .build() +} diff --git a/frontend/rust-lib/flowy-grid/tests/grid/grid_test.rs b/frontend/rust-lib/flowy-grid/tests/grid/grid_test.rs new file mode 100644 index 0000000000..abc00d5fb2 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/tests/grid/grid_test.rs @@ -0,0 +1,435 @@ +use crate::grid::script::EditorScript::*; +use crate::grid::script::*; +use chrono::NaiveDateTime; +use flowy_grid::services::cell::*; +use flowy_grid::services::row::{deserialize_cell_data, serialize_cell_data, CellDataSerde, CreateRowMetaBuilder}; +use flowy_grid_data_model::entities::{ + CellMetaChangeset, FieldChangeset, FieldType, GridBlockMeta, GridBlockMetaChangeset, RowMetaChangeset, +}; + +#[tokio::test] +async fn grid_create_field() { + let mut test = GridEditorTest::new().await; + let text_field = create_text_field(); + let single_select_field = create_single_select_field(); + + let scripts = vec![ + CreateField { + field_meta: text_field.clone(), + }, + AssertFieldEqual { + field_index: test.field_count, + field_meta: text_field, + }, + ]; + test.run_scripts(scripts).await; + + let scripts = vec![ + CreateField { + field_meta: single_select_field.clone(), + }, + AssertFieldEqual { + field_index: test.field_count, + field_meta: single_select_field, + }, + ]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_create_duplicate_field() { + let mut test = GridEditorTest::new().await; + let text_field = create_text_field(); + let field_count = test.field_count; + let expected_field_count = field_count + 1; + let scripts = vec![ + CreateField { + field_meta: text_field.clone(), + }, + CreateField { + field_meta: text_field.clone(), + }, + AssertFieldCount(expected_field_count), + ]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_update_field_with_empty_change() { + let mut test = GridEditorTest::new().await; + let single_select_field = create_single_select_field(); + let changeset = FieldChangeset { + field_id: single_select_field.id.clone(), + name: None, + desc: None, + field_type: None, + frozen: None, + visibility: None, + width: None, + type_options: None, + }; + + let scripts = vec![ + CreateField { + field_meta: single_select_field.clone(), + }, + UpdateField { changeset }, + AssertFieldEqual { + field_index: test.field_count, + field_meta: single_select_field, + }, + ]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_update_field() { + let mut test = GridEditorTest::new().await; + let single_select_field = create_single_select_field(); + let mut cloned_field = single_select_field.clone(); + + let mut single_select_type_options = SingleSelectDescription::from(&single_select_field); + single_select_type_options.options.push(SelectOption::new("Unknown")); + let changeset = FieldChangeset { + field_id: single_select_field.id.clone(), + name: None, + desc: None, + field_type: None, + frozen: Some(true), + visibility: None, + width: Some(1000), + type_options: Some(single_select_type_options.clone().into()), + }; + + cloned_field.frozen = true; + cloned_field.width = 1000; + cloned_field.type_options = single_select_type_options.into(); + + let scripts = vec![ + CreateField { + field_meta: single_select_field.clone(), + }, + UpdateField { changeset }, + AssertFieldEqual { + field_index: test.field_count, + field_meta: cloned_field, + }, + ]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_delete_field() { + let mut test = GridEditorTest::new().await; + let expected_field_count = test.field_count; + let text_field = create_text_field(); + let scripts = vec![ + CreateField { + field_meta: text_field.clone(), + }, + DeleteField { field_meta: text_field }, + AssertFieldCount(expected_field_count), + ]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_create_block() { + let grid_block = GridBlockMeta::new(); + let scripts = vec![ + AssertBlockCount(1), + CreateBlock { block: grid_block }, + AssertBlockCount(2), + ]; + GridEditorTest::new().await.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_update_block() { + let grid_block = GridBlockMeta::new(); + let mut cloned_grid_block = grid_block.clone(); + let changeset = GridBlockMetaChangeset { + block_id: grid_block.block_id.clone(), + start_row_index: Some(2), + row_count: Some(10), + }; + + cloned_grid_block.start_row_index = 2; + cloned_grid_block.row_count = 10; + + let scripts = vec![ + AssertBlockCount(1), + CreateBlock { block: grid_block }, + UpdateBlock { changeset }, + AssertBlockCount(2), + AssertBlockEqual { + block_index: 1, + block: cloned_grid_block, + }, + ]; + GridEditorTest::new().await.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_create_row() { + let scripts = vec![AssertRowCount(3), CreateEmptyRow, CreateEmptyRow, AssertRowCount(5)]; + GridEditorTest::new().await.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_create_row2() { + let mut test = GridEditorTest::new().await; + let create_row_context = CreateRowMetaBuilder::new(&test.field_metas).build(); + let scripts = vec![ + AssertRowCount(3), + CreateRow { + context: create_row_context, + }, + AssertRowCount(4), + ]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_update_row() { + let mut test = GridEditorTest::new().await; + let context = CreateRowMetaBuilder::new(&test.field_metas).build(); + let changeset = RowMetaChangeset { + row_id: context.row_id.clone(), + height: None, + visibility: None, + cell_by_field_id: Default::default(), + }; + + let scripts = vec![ + AssertRowCount(3), + CreateRow { context }, + UpdateRow { + changeset: changeset.clone(), + }, + AssertRow { changeset }, + AssertRowCount(4), + ]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_delete_row() { + let mut test = GridEditorTest::new().await; + let context_1 = CreateRowMetaBuilder::new(&test.field_metas).build(); + let context_2 = CreateRowMetaBuilder::new(&test.field_metas).build(); + let row_ids = vec![context_1.row_id.clone(), context_2.row_id.clone()]; + let scripts = vec![ + AssertRowCount(3), + CreateRow { context: context_1 }, + CreateRow { context: context_2 }, + AssertBlockCount(1), + AssertBlock { + block_index: 0, + row_count: 5, + start_row_index: 0, + }, + DeleteRow { row_ids }, + AssertBlock { + block_index: 0, + row_count: 3, + start_row_index: 0, + }, + ]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_row_add_cells_test() { + let mut test = GridEditorTest::new().await; + let mut builder = CreateRowMetaBuilder::new(&test.field_metas); + for field in &test.field_metas { + match field.field_type { + FieldType::RichText => { + let data = serialize_cell_data("hello world", field).unwrap(); + builder.add_cell(&field.id, data).unwrap(); + } + FieldType::Number => { + let data = serialize_cell_data("¥18,443", field).unwrap(); + builder.add_cell(&field.id, data).unwrap(); + } + FieldType::DateTime => { + let data = serialize_cell_data("1647251762", field).unwrap(); + builder.add_cell(&field.id, data).unwrap(); + } + FieldType::SingleSelect => { + let description = SingleSelectDescription::from(field); + let options = description.options.first().unwrap(); + let data = description.serialize_cell_data(&options.id).unwrap(); + builder.add_cell(&field.id, data).unwrap(); + } + FieldType::MultiSelect => { + let description = MultiSelectDescription::from(field); + let options = description + .options + .iter() + .map(|option| option.id.clone()) + .collect::>() + .join(SELECTION_IDS_SEPARATOR); + let data = description.serialize_cell_data(&options).unwrap(); + builder.add_cell(&field.id, data).unwrap(); + } + FieldType::Checkbox => { + let data = serialize_cell_data("false", field).unwrap(); + builder.add_cell(&field.id, data).unwrap(); + } + } + } + let context = builder.build(); + let scripts = vec![CreateRow { context }, AssertGridMetaPad]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_row_add_selection_cell_test() { + let mut test = GridEditorTest::new().await; + let mut builder = CreateRowMetaBuilder::new(&test.field_metas); + let uuid = uuid::Uuid::new_v4().to_string(); + let mut single_select_field_id = "".to_string(); + let mut multi_select_field_id = "".to_string(); + for field in &test.field_metas { + match field.field_type { + FieldType::SingleSelect => { + single_select_field_id = field.id.clone(); + // The element must be parsed as uuid + assert!(builder.add_cell(&field.id, "data".to_owned()).is_err()); + // // The data should not be empty + assert!(builder.add_cell(&field.id, "".to_owned()).is_err()); + // The element must be parsed as uuid + assert!(builder.add_cell(&field.id, "1,2,3".to_owned()).is_err(),); + // The separator must be comma + assert!(builder.add_cell(&field.id, format!("{}. {}", &uuid, &uuid),).is_err()); + // + + assert!(builder.add_cell(&field.id, uuid.clone()).is_ok()); + assert!(builder.add_cell(&field.id, format!("{}, {}", &uuid, &uuid)).is_ok()); + } + FieldType::MultiSelect => { + multi_select_field_id = field.id.clone(); + assert!(builder.add_cell(&field.id, format!("{}, {}", &uuid, &uuid)).is_ok()); + } + _ => {} + } + } + let context = builder.build(); + assert_eq!( + &context + .cell_by_field_id + .get(&single_select_field_id) + .as_ref() + .unwrap() + .data, + &uuid + ); + assert_eq!( + context + .cell_by_field_id + .get(&multi_select_field_id) + .as_ref() + .unwrap() + .data, + format!("{},{}", &uuid, &uuid) + ); + + let scripts = vec![CreateRow { context }]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_row_add_date_cell_test() { + let mut test = GridEditorTest::new().await; + let mut builder = CreateRowMetaBuilder::new(&test.field_metas); + let mut date_field = None; + let timestamp = 1647390674; + for field in &test.field_metas { + if field.field_type == FieldType::DateTime { + date_field = Some(field.clone()); + NaiveDateTime::from_timestamp(123, 0); + // The data should not be empty + assert!(builder.add_cell(&field.id, "".to_owned()).is_err()); + + assert!(builder.add_cell(&field.id, "123".to_owned()).is_ok()); + assert!(builder.add_cell(&field.id, format!("{}", timestamp)).is_ok()); + } + } + let context = builder.build(); + let date_field = date_field.unwrap(); + let cell_data = context.cell_by_field_id.get(&date_field.id).unwrap().clone(); + assert_eq!( + deserialize_cell_data(cell_data.data.clone(), &date_field).unwrap(), + "2022/03/16 08:31", + ); + let scripts = vec![CreateRow { context }]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn grid_cell_update() { + let mut test = GridEditorTest::new().await; + let field_metas = &test.field_metas; + let row_metas = &test.row_metas; + let grid_blocks = &test.grid_blocks; + assert_eq!(row_metas.len(), 3); + assert_eq!(grid_blocks.len(), 1); + + let block_id = &grid_blocks.first().unwrap().block_id; + let mut scripts = vec![]; + for (index, row_meta) in row_metas.iter().enumerate() { + for field_meta in field_metas { + if index == 0 { + let data = match field_meta.field_type { + FieldType::RichText => "".to_string(), + FieldType::Number => "123".to_string(), + FieldType::DateTime => "123".to_string(), + FieldType::SingleSelect => { + let description = SingleSelectDescription::from(field_meta); + description.options.first().unwrap().id.clone() + } + FieldType::MultiSelect => { + let description = MultiSelectDescription::from(field_meta); + description.options.first().unwrap().id.clone() + } + FieldType::Checkbox => "1".to_string(), + }; + + scripts.push(UpdateCell { + changeset: CellMetaChangeset { + grid_id: block_id.to_string(), + row_id: row_meta.id.clone(), + field_id: field_meta.id.clone(), + data: Some(data), + }, + is_err: false, + }); + } + + if index == 1 { + let (data, is_err) = match field_meta.field_type { + FieldType::RichText => ("1".to_string().repeat(10001), true), + FieldType::Number => ("abc".to_string(), true), + FieldType::DateTime => ("abc".to_string(), true), + FieldType::SingleSelect => ("abc".to_string(), true), + FieldType::MultiSelect => ("abc".to_string(), true), + FieldType::Checkbox => ("2".to_string(), false), + }; + + scripts.push(UpdateCell { + changeset: CellMetaChangeset { + grid_id: block_id.to_string(), + row_id: row_meta.id.clone(), + field_id: field_meta.id.clone(), + data: Some(data), + }, + is_err, + }); + } + } + } + + test.run_scripts(scripts).await; +} diff --git a/frontend/rust-lib/flowy-grid/tests/grid/mod.rs b/frontend/rust-lib/flowy-grid/tests/grid/mod.rs new file mode 100644 index 0000000000..04b16720e5 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/tests/grid/mod.rs @@ -0,0 +1,2 @@ +mod grid_test; +mod script; diff --git a/frontend/rust-lib/flowy-grid/tests/grid/script.rs b/frontend/rust-lib/flowy-grid/tests/grid/script.rs new file mode 100644 index 0000000000..eba36d8bbd --- /dev/null +++ b/frontend/rust-lib/flowy-grid/tests/grid/script.rs @@ -0,0 +1,337 @@ +use bytes::Bytes; +use flowy_collaboration::client_grid::GridBuilder; +use std::collections::HashMap; + +use flowy_grid::services::cell::*; +use flowy_grid::services::field::*; +use flowy_grid::services::grid_editor::{ClientGridEditor, GridPadBuilder}; +use flowy_grid::services::row::CreateRowMetaPayload; +use flowy_grid_data_model::entities::{ + BuildGridContext, CellMetaChangeset, FieldChangeset, FieldMeta, FieldType, GridBlockMeta, GridBlockMetaChangeset, + RowMeta, RowMetaChangeset, RowOrder, +}; +use flowy_sync::REVISION_WRITE_INTERVAL_IN_MILLIS; +use flowy_test::helper::ViewTest; +use flowy_test::FlowySDKTest; +use std::sync::Arc; +use std::time::Duration; +use strum::EnumCount; +use tokio::time::sleep; + +pub enum EditorScript { + CreateField { + field_meta: FieldMeta, + }, + UpdateField { + changeset: FieldChangeset, + }, + DeleteField { + field_meta: FieldMeta, + }, + AssertFieldCount(usize), + AssertFieldEqual { + field_index: usize, + field_meta: FieldMeta, + }, + CreateBlock { + block: GridBlockMeta, + }, + UpdateBlock { + changeset: GridBlockMetaChangeset, + }, + AssertBlockCount(usize), + AssertBlock { + block_index: usize, + row_count: i32, + start_row_index: i32, + }, + AssertBlockEqual { + block_index: usize, + block: GridBlockMeta, + }, + CreateEmptyRow, + CreateRow { + context: CreateRowMetaPayload, + }, + UpdateRow { + changeset: RowMetaChangeset, + }, + AssertRow { + changeset: RowMetaChangeset, + }, + DeleteRow { + row_ids: Vec, + }, + UpdateCell { + changeset: CellMetaChangeset, + is_err: bool, + }, + AssertRowCount(usize), + // AssertRowEqual{ row_index: usize, row: RowMeta}, + AssertGridMetaPad, +} + +pub struct GridEditorTest { + pub sdk: FlowySDKTest, + pub grid_id: String, + pub editor: Arc, + pub field_metas: Vec, + pub grid_blocks: Vec, + pub row_metas: Vec>, + pub field_count: usize, + + pub row_order_by_row_id: HashMap, +} + +impl GridEditorTest { + pub async fn new() -> Self { + let sdk = FlowySDKTest::default(); + let _ = sdk.init_user().await; + let build_context = make_template_1_grid(); + let view_data: Bytes = build_context.try_into().unwrap(); + let test = ViewTest::new_grid_view(&sdk, view_data.to_vec()).await; + let editor = sdk.grid_manager.open_grid(&test.view.id).await.unwrap(); + let field_metas = editor.get_field_metas(None).await.unwrap(); + let grid_blocks = editor.get_block_metas().await.unwrap(); + let row_metas = get_row_metas(&editor).await; + + let grid_id = test.view.id; + Self { + sdk, + grid_id, + editor, + field_metas, + grid_blocks, + row_metas, + field_count: FieldType::COUNT, + row_order_by_row_id: HashMap::default(), + } + } + + pub async fn run_scripts(&mut self, scripts: Vec) { + for script in scripts { + self.run_script(script).await; + } + } + + pub async fn run_script(&mut self, script: EditorScript) { + let grid_manager = self.sdk.grid_manager.clone(); + let pool = self.sdk.user_session.db_pool().unwrap(); + let rev_manager = self.editor.rev_manager(); + let _cache = rev_manager.revision_cache().await; + + match script { + EditorScript::CreateField { field_meta } => { + if !self.editor.contain_field(&field_meta).await { + self.field_count += 1; + } + self.editor.create_field(field_meta).await.unwrap(); + self.field_metas = self.editor.get_field_metas(None).await.unwrap(); + assert_eq!(self.field_count, self.field_metas.len()); + } + EditorScript::UpdateField { changeset: change } => { + self.editor.update_field(change).await.unwrap(); + self.field_metas = self.editor.get_field_metas(None).await.unwrap(); + } + EditorScript::DeleteField { field_meta } => { + if self.editor.contain_field(&field_meta).await { + self.field_count -= 1; + } + + self.editor.delete_field(&field_meta.id).await.unwrap(); + self.field_metas = self.editor.get_field_metas(None).await.unwrap(); + assert_eq!(self.field_count, self.field_metas.len()); + } + EditorScript::AssertFieldCount(count) => { + assert_eq!(self.editor.get_field_metas(None).await.unwrap().len(), count); + } + EditorScript::AssertFieldEqual { + field_index, + field_meta, + } => { + let field_metas = self.editor.get_field_metas(None).await.unwrap(); + assert_eq!(field_metas[field_index].clone(), field_meta); + } + EditorScript::CreateBlock { block } => { + self.editor.create_block(block).await.unwrap(); + self.grid_blocks = self.editor.get_block_metas().await.unwrap(); + } + EditorScript::UpdateBlock { changeset: change } => { + self.editor.update_block(change).await.unwrap(); + } + EditorScript::AssertBlockCount(count) => { + assert_eq!(self.editor.get_block_metas().await.unwrap().len(), count); + } + EditorScript::AssertBlock { + block_index, + row_count, + start_row_index, + } => { + assert_eq!(self.grid_blocks[block_index].row_count, row_count); + assert_eq!(self.grid_blocks[block_index].start_row_index, start_row_index); + } + EditorScript::AssertBlockEqual { block_index, block } => { + let blocks = self.editor.get_block_metas().await.unwrap(); + let compared_block = blocks[block_index].clone(); + assert_eq!(compared_block, block); + } + EditorScript::CreateEmptyRow => { + let row_order = self.editor.create_row(None).await.unwrap(); + self.row_order_by_row_id.insert(row_order.row_id.clone(), row_order); + self.row_metas = self.get_row_metas().await; + self.grid_blocks = self.editor.get_block_metas().await.unwrap(); + } + EditorScript::CreateRow { context } => { + let row_orders = self.editor.insert_rows(vec![context]).await.unwrap(); + for row_order in row_orders { + self.row_order_by_row_id.insert(row_order.row_id.clone(), row_order); + } + self.row_metas = self.get_row_metas().await; + self.grid_blocks = self.editor.get_block_metas().await.unwrap(); + } + EditorScript::UpdateRow { changeset: change } => self.editor.update_row(change).await.unwrap(), + EditorScript::DeleteRow { row_ids } => { + let row_orders = row_ids + .into_iter() + .map(|row_id| self.row_order_by_row_id.get(&row_id).unwrap().clone()) + .collect::>(); + + self.editor.delete_rows(row_orders).await.unwrap(); + self.row_metas = self.get_row_metas().await; + self.grid_blocks = self.editor.get_block_metas().await.unwrap(); + } + EditorScript::AssertRow { changeset } => { + let row = self.row_metas.iter().find(|row| row.id == changeset.row_id).unwrap(); + + if let Some(visibility) = changeset.visibility { + assert_eq!(row.visibility, visibility); + } + + if let Some(height) = changeset.height { + assert_eq!(row.height, height); + } + } + EditorScript::UpdateCell { changeset, is_err } => { + let result = self.editor.update_cell(changeset).await; + if is_err { + assert!(result.is_err()) + } else { + let _ = result.unwrap(); + self.row_metas = self.get_row_metas().await; + } + } + EditorScript::AssertRowCount(count) => { + assert_eq!(self.row_metas.len(), count); + } + EditorScript::AssertGridMetaPad => { + sleep(Duration::from_millis(2 * REVISION_WRITE_INTERVAL_IN_MILLIS)).await; + let mut grid_rev_manager = grid_manager.make_grid_rev_manager(&self.grid_id, pool.clone()).unwrap(); + let grid_pad = grid_rev_manager.load::(None).await.unwrap(); + println!("{}", grid_pad.delta_str()); + } + } + } + + async fn get_row_metas(&self) -> Vec> { + get_row_metas(&self.editor).await + } +} + +async fn get_row_metas(editor: &Arc) -> Vec> { + editor + .get_block_meta_data_vec(None) + .await + .unwrap() + .pop() + .unwrap() + .row_metas +} + +pub fn create_text_field() -> FieldMeta { + FieldBuilder::new(RichTextTypeOptionsBuilder::default()) + .name("Name") + .visibility(true) + .field_type(FieldType::RichText) + .build() +} + +pub fn create_single_select_field() -> FieldMeta { + let single_select = SingleSelectTypeOptionsBuilder::default() + .option(SelectOption::new("Done")) + .option(SelectOption::new("Progress")); + + FieldBuilder::new(single_select) + .name("Name") + .visibility(true) + .field_type(FieldType::SingleSelect) + .build() +} + +fn make_template_1_grid() -> BuildGridContext { + let text_field = FieldBuilder::new(RichTextTypeOptionsBuilder::default()) + .name("Name") + .visibility(true) + .field_type(FieldType::RichText) + .build(); + + // Single Select + let single_select = SingleSelectTypeOptionsBuilder::default() + .option(SelectOption::new("Live")) + .option(SelectOption::new("Completed")) + .option(SelectOption::new("Planned")) + .option(SelectOption::new("Paused")); + let single_select_field = FieldBuilder::new(single_select) + .name("Status") + .visibility(true) + .field_type(FieldType::SingleSelect) + .build(); + + // MultiSelect + let multi_select = MultiSelectTypeOptionsBuilder::default() + .option(SelectOption::new("Google")) + .option(SelectOption::new("Facebook")) + .option(SelectOption::new("Twitter")); + let multi_select_field = FieldBuilder::new(multi_select) + .name("Platform") + .visibility(true) + .field_type(FieldType::MultiSelect) + .build(); + + // Number + let number = NumberTypeOptionsBuilder::default().set_format(NumberFormat::USD); + let number_field = FieldBuilder::new(number) + .name("Price") + .visibility(true) + .field_type(FieldType::Number) + .build(); + + // Date + let date = DateTypeOptionsBuilder::default() + .date_format(DateFormat::US) + .time_format(TimeFormat::TwentyFourHour); + let date_field = FieldBuilder::new(date) + .name("Time") + .visibility(true) + .field_type(FieldType::DateTime) + .build(); + + // Checkbox + let checkbox = CheckboxTypeOptionsBuilder::default(); + let checkbox_field = FieldBuilder::new(checkbox) + .name("is done") + .visibility(true) + .field_type(FieldType::Checkbox) + .build(); + + GridBuilder::default() + .add_field(text_field) + .add_field(single_select_field) + .add_field(multi_select_field) + .add_field(number_field) + .add_field(date_field) + .add_field(checkbox_field) + .add_empty_row() + .add_empty_row() + .add_empty_row() + .build() +} diff --git a/frontend/rust-lib/flowy-grid/tests/main.rs b/frontend/rust-lib/flowy-grid/tests/main.rs new file mode 100644 index 0000000000..ec055c3bb9 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/tests/main.rs @@ -0,0 +1 @@ +mod grid; diff --git a/frontend/rust-lib/flowy-net/src/http_server/document.rs b/frontend/rust-lib/flowy-net/src/http_server/document.rs index da33e1b8a0..1016e903e4 100644 --- a/frontend/rust-lib/flowy-net/src/http_server/document.rs +++ b/frontend/rust-lib/flowy-net/src/http_server/document.rs @@ -3,7 +3,9 @@ use crate::{ request::{HttpRequestBuilder, ResponseMiddleware}, }; use flowy_block::BlockCloudService; -use flowy_collaboration::entities::document_info::{BlockId, BlockInfo, CreateBlockParams, ResetBlockParams}; +use flowy_collaboration::entities::text_block_info::{ + CreateTextBlockParams, ResetTextBlockParams, TextBlockId, TextBlockInfo, +}; use flowy_error::FlowyError; use http_flowy::response::FlowyResponse; use lazy_static::lazy_static; @@ -21,26 +23,26 @@ impl BlockHttpCloudService { } impl BlockCloudService for BlockHttpCloudService { - fn create_block(&self, token: &str, params: CreateBlockParams) -> FutureResult<(), FlowyError> { + fn create_block(&self, token: &str, params: CreateTextBlockParams) -> FutureResult<(), FlowyError> { let token = token.to_owned(); let url = self.config.doc_url(); FutureResult::new(async move { create_document_request(&token, params, &url).await }) } - fn read_block(&self, token: &str, params: BlockId) -> FutureResult, FlowyError> { + fn read_block(&self, token: &str, params: TextBlockId) -> FutureResult, FlowyError> { let token = token.to_owned(); let url = self.config.doc_url(); FutureResult::new(async move { read_document_request(&token, params, &url).await }) } - fn update_block(&self, token: &str, params: ResetBlockParams) -> FutureResult<(), FlowyError> { + fn update_block(&self, token: &str, params: ResetTextBlockParams) -> FutureResult<(), FlowyError> { let token = token.to_owned(); let url = self.config.doc_url(); FutureResult::new(async move { reset_doc_request(&token, params, &url).await }) } } -pub async fn create_document_request(token: &str, params: CreateBlockParams, url: &str) -> Result<(), FlowyError> { +pub async fn create_document_request(token: &str, params: CreateTextBlockParams, url: &str) -> Result<(), FlowyError> { let _ = request_builder() .post(&url.to_owned()) .header(HEADER_TOKEN, token) @@ -50,7 +52,11 @@ pub async fn create_document_request(token: &str, params: CreateBlockParams, url Ok(()) } -pub async fn read_document_request(token: &str, params: BlockId, url: &str) -> Result, FlowyError> { +pub async fn read_document_request( + token: &str, + params: TextBlockId, + url: &str, +) -> Result, FlowyError> { let doc = request_builder() .get(&url.to_owned()) .header(HEADER_TOKEN, token) @@ -61,7 +67,7 @@ pub async fn read_document_request(token: &str, params: BlockId, url: &str) -> R Ok(doc) } -pub async fn reset_doc_request(token: &str, params: ResetBlockParams, url: &str) -> Result<(), FlowyError> { +pub async fn reset_doc_request(token: &str, params: ResetTextBlockParams, url: &str) -> Result<(), FlowyError> { let _ = request_builder() .patch(&url.to_owned()) .header(HEADER_TOKEN, token) diff --git a/frontend/rust-lib/flowy-net/src/local_server/persistence.rs b/frontend/rust-lib/flowy-net/src/local_server/persistence.rs index db23fbf2ef..525b487ce4 100644 --- a/frontend/rust-lib/flowy-net/src/local_server/persistence.rs +++ b/frontend/rust-lib/flowy-net/src/local_server/persistence.rs @@ -1,5 +1,5 @@ use flowy_collaboration::{ - entities::{document_info::BlockInfo, folder_info::FolderInfo}, + entities::{folder_info::FolderInfo, text_block_info::TextBlockInfo}, errors::CollaborateError, protobuf::{RepeatedRevision as RepeatedRevisionPB, Revision as RevisionPB}, server_document::*, @@ -29,25 +29,25 @@ pub trait RevisionCloudStorage: Send + Sync { ) -> BoxResultFuture<(), CollaborateError>; } -pub(crate) struct LocalDocumentCloudPersistence { +pub(crate) struct LocalTextBlockCloudPersistence { storage: Arc, } -impl Debug for LocalDocumentCloudPersistence { +impl Debug for LocalTextBlockCloudPersistence { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.write_str("LocalRevisionCloudPersistence") } } -impl std::default::Default for LocalDocumentCloudPersistence { +impl std::default::Default for LocalTextBlockCloudPersistence { fn default() -> Self { - LocalDocumentCloudPersistence { + LocalTextBlockCloudPersistence { storage: Arc::new(MemoryDocumentCloudStorage::default()), } } } -impl FolderCloudPersistence for LocalDocumentCloudPersistence { +impl FolderCloudPersistence for LocalTextBlockCloudPersistence { fn read_folder(&self, _user_id: &str, folder_id: &str) -> BoxResultFuture { let storage = self.storage.clone(); let folder_id = folder_id.to_owned(); @@ -110,8 +110,8 @@ impl FolderCloudPersistence for LocalDocumentCloudPersistence { } } -impl DocumentCloudPersistence for LocalDocumentCloudPersistence { - fn read_document(&self, doc_id: &str) -> BoxResultFuture { +impl TextBlockCloudPersistence for LocalTextBlockCloudPersistence { + fn read_text_block(&self, doc_id: &str) -> BoxResultFuture { let storage = self.storage.clone(); let doc_id = doc_id.to_owned(); Box::pin(async move { @@ -123,11 +123,11 @@ impl DocumentCloudPersistence for LocalDocumentCloudPersistence { }) } - fn create_document( + fn create_text_block( &self, doc_id: &str, repeated_revision: RepeatedRevisionPB, - ) -> BoxResultFuture, CollaborateError> { + ) -> BoxResultFuture, CollaborateError> { let doc_id = doc_id.to_owned(); let storage = self.storage.clone(); Box::pin(async move { @@ -136,7 +136,7 @@ impl DocumentCloudPersistence for LocalDocumentCloudPersistence { }) } - fn read_document_revisions( + fn read_text_block_revisions( &self, doc_id: &str, rev_ids: Option>, @@ -150,7 +150,10 @@ impl DocumentCloudPersistence for LocalDocumentCloudPersistence { }) } - fn save_document_revisions(&self, repeated_revision: RepeatedRevisionPB) -> BoxResultFuture<(), CollaborateError> { + fn save_text_block_revisions( + &self, + repeated_revision: RepeatedRevisionPB, + ) -> BoxResultFuture<(), CollaborateError> { let storage = self.storage.clone(); Box::pin(async move { let _ = storage.set_revisions(repeated_revision).await?; @@ -158,7 +161,7 @@ impl DocumentCloudPersistence for LocalDocumentCloudPersistence { }) } - fn reset_document(&self, doc_id: &str, revisions: RepeatedRevisionPB) -> BoxResultFuture<(), CollaborateError> { + fn reset_text_block(&self, doc_id: &str, revisions: RepeatedRevisionPB) -> BoxResultFuture<(), CollaborateError> { let storage = self.storage.clone(); let doc_id = doc_id.to_owned(); Box::pin(async move { diff --git a/frontend/rust-lib/flowy-net/src/local_server/server.rs b/frontend/rust-lib/flowy-net/src/local_server/server.rs index 3bfa30e06a..6bcd538a6b 100644 --- a/frontend/rust-lib/flowy-net/src/local_server/server.rs +++ b/frontend/rust-lib/flowy-net/src/local_server/server.rs @@ -1,10 +1,10 @@ -use crate::local_server::persistence::LocalDocumentCloudPersistence; +use crate::local_server::persistence::LocalTextBlockCloudPersistence; use async_stream::stream; use bytes::Bytes; use flowy_collaboration::{ client_document::default::initial_quill_delta_string, entities::{ - document_info::{BlockId, BlockInfo, CreateBlockParams, ResetBlockParams}, + text_block_info::{CreateTextBlockParams, ResetTextBlockParams, TextBlockId, TextBlockInfo}, ws_data::{ClientRevisionWSData, ClientRevisionWSDataType}, }, errors::CollaborateError, @@ -38,7 +38,7 @@ impl LocalServer { client_ws_sender: mpsc::UnboundedSender, client_ws_receiver: broadcast::Sender, ) -> Self { - let persistence = Arc::new(LocalDocumentCloudPersistence::default()); + let persistence = Arc::new(LocalTextBlockCloudPersistence::default()); let doc_manager = Arc::new(ServerDocumentManager::new(persistence.clone())); let folder_manager = Arc::new(ServerFolderManager::new(persistence)); let stop_tx = RwLock::new(None); @@ -308,7 +308,7 @@ impl FolderCouldServiceV1 for LocalServer { belongings: RepeatedView::default(), modified_time: time, create_time: time, - ext_data: params.ext_data, + ext_data: "".to_string(), thumbnail: params.thumbnail, plugin_type: params.plugin_type, }; @@ -413,12 +413,12 @@ impl UserCloudService for LocalServer { } impl BlockCloudService for LocalServer { - fn create_block(&self, _token: &str, _params: CreateBlockParams) -> FutureResult<(), FlowyError> { + fn create_block(&self, _token: &str, _params: CreateTextBlockParams) -> FutureResult<(), FlowyError> { FutureResult::new(async { Ok(()) }) } - fn read_block(&self, _token: &str, params: BlockId) -> FutureResult, FlowyError> { - let doc = BlockInfo { + fn read_block(&self, _token: &str, params: TextBlockId) -> FutureResult, FlowyError> { + let doc = TextBlockInfo { block_id: params.value, text: initial_quill_delta_string(), rev_id: 0, @@ -427,7 +427,7 @@ impl BlockCloudService for LocalServer { FutureResult::new(async { Ok(Some(doc)) }) } - fn update_block(&self, _token: &str, _params: ResetBlockParams) -> FutureResult<(), FlowyError> { + fn update_block(&self, _token: &str, _params: ResetTextBlockParams) -> FutureResult<(), FlowyError> { FutureResult::new(async { Ok(()) }) } } diff --git a/frontend/rust-lib/flowy-sdk/Cargo.toml b/frontend/rust-lib/flowy-sdk/Cargo.toml index 75791d0279..75ab8a3b5c 100644 --- a/frontend/rust-lib/flowy-sdk/Cargo.toml +++ b/frontend/rust-lib/flowy-sdk/Cargo.toml @@ -12,6 +12,7 @@ flowy-user = { path = "../flowy-user" } flowy-net = { path = "../flowy-net" } flowy-folder = { path = "../flowy-folder", default-features = false } flowy-grid = { path = "../flowy-grid", default-features = false } +flowy-grid-data-model = { path = "../../../shared-lib/flowy-grid-data-model" } flowy-database = { path = "../flowy-database" } flowy-block = { path = "../flowy-block", default-features = false } flowy-sync = { path = "../flowy-sync" } diff --git a/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs b/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs index e648bd9e66..6ed3df3207 100644 --- a/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs +++ b/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs @@ -1,9 +1,10 @@ use bytes::Bytes; -use flowy_block::BlockManager; +use flowy_block::TextBlockManager; use flowy_collaboration::client_document::default::initial_quill_delta_string; -use flowy_collaboration::entities::revision::RepeatedRevision; +use flowy_collaboration::entities::revision::{RepeatedRevision, Revision}; use flowy_collaboration::entities::ws_data::ClientRevisionWSData; use flowy_database::ConnectionPool; + use flowy_folder::manager::{ViewDataProcessor, ViewDataProcessorMap}; use flowy_folder::prelude::ViewDataType; use flowy_folder::{ @@ -11,8 +12,9 @@ use flowy_folder::{ event_map::{FolderCouldServiceV1, WorkspaceDatabase, WorkspaceUser}, manager::FolderManager, }; -use flowy_grid::manager::GridManager; -use flowy_grid::services::grid_builder::make_default_grid; +use flowy_grid::manager::{make_grid_view_data, GridManager}; +use flowy_grid::util::make_default_grid; +use flowy_grid_data_model::entities::BuildGridContext; use flowy_net::ClientServerConfiguration; use flowy_net::{ http_server::folder::FolderHttpCloudService, local_server::LocalServer, ws::connection::FlowyWebSocketConnect, @@ -23,6 +25,7 @@ use futures_core::future::BoxFuture; use lib_infra::future::{BoxResultFuture, FutureResult}; use lib_ws::{WSChannel, WSMessageReceiver, WebSocketRawMessage}; use std::collections::HashMap; +use std::convert::TryFrom; use std::{convert::TryInto, sync::Arc}; pub struct FolderDepsResolver(); @@ -32,7 +35,7 @@ impl FolderDepsResolver { user_session: Arc, server_config: &ClientServerConfiguration, ws_conn: &Arc, - block_manager: &Arc, + text_block_manager: &Arc, grid_manager: &Arc, ) -> Arc { let user: Arc = Arc::new(WorkspaceUserImpl(user_session.clone())); @@ -43,7 +46,7 @@ impl FolderDepsResolver { Some(local_server) => local_server, }; - let view_data_processor = make_view_data_processor(block_manager.clone(), grid_manager.clone()); + let view_data_processor = make_view_data_processor(text_block_manager.clone(), grid_manager.clone()); let folder_manager = Arc::new(FolderManager::new(user.clone(), cloud_service, database, view_data_processor, web_socket).await); @@ -60,13 +63,16 @@ impl FolderDepsResolver { } } -fn make_view_data_processor(block_manager: Arc, grid_manager: Arc) -> ViewDataProcessorMap { +fn make_view_data_processor( + text_block_manager: Arc, + grid_manager: Arc, +) -> ViewDataProcessorMap { let mut map: HashMap> = HashMap::new(); - let block_data_impl = BlockManagerViewDataImpl(block_manager); + let block_data_impl = TextBlockViewDataProcessor(text_block_manager); map.insert(block_data_impl.data_type(), Arc::new(block_data_impl)); - let grid_data_impl = GridManagerViewDataImpl(grid_manager); + let grid_data_impl = GridViewDataProcessor(grid_manager); map.insert(grid_data_impl.data_type(), Arc::new(grid_data_impl)); Arc::new(map) @@ -130,68 +136,89 @@ impl WSMessageReceiver for FolderWSMessageReceiverImpl { } } -struct BlockManagerViewDataImpl(Arc); -impl ViewDataProcessor for BlockManagerViewDataImpl { +struct TextBlockViewDataProcessor(Arc); +impl ViewDataProcessor for TextBlockViewDataProcessor { fn initialize(&self) -> FutureResult<(), FlowyError> { - let block_manager = self.0.clone(); - FutureResult::new(async move { block_manager.init() }) + let manager = self.0.clone(); + FutureResult::new(async move { manager.init() }) } - fn create_container(&self, view_id: &str, repeated_revision: RepeatedRevision) -> FutureResult<(), FlowyError> { - let block_manager = self.0.clone(); + fn create_container(&self, user_id: &str, view_id: &str, delta_data: Bytes) -> FutureResult<(), FlowyError> { + let repeated_revision: RepeatedRevision = Revision::initial_revision(user_id, view_id, delta_data).into(); let view_id = view_id.to_string(); + let manager = self.0.clone(); FutureResult::new(async move { - let _ = block_manager.create_block(view_id, repeated_revision).await?; + let _ = manager.create_block(view_id, repeated_revision).await?; Ok(()) }) } fn delete_container(&self, view_id: &str) -> FutureResult<(), FlowyError> { - let block_manager = self.0.clone(); + let manager = self.0.clone(); let view_id = view_id.to_string(); FutureResult::new(async move { - let _ = block_manager.delete_block(view_id)?; + let _ = manager.delete_block(view_id)?; Ok(()) }) } fn close_container(&self, view_id: &str) -> FutureResult<(), FlowyError> { - let block_manager = self.0.clone(); + let manager = self.0.clone(); let view_id = view_id.to_string(); FutureResult::new(async move { - let _ = block_manager.close_block(view_id)?; + let _ = manager.close_block(view_id)?; Ok(()) }) } - fn delta_str(&self, view_id: &str) -> FutureResult { + fn delta_bytes(&self, view_id: &str) -> FutureResult { let view_id = view_id.to_string(); - let block_manager = self.0.clone(); + let manager = self.0.clone(); FutureResult::new(async move { - let editor = block_manager.open_block(view_id).await?; - let delta_str = editor.delta_str().await?; - Ok(delta_str) + let editor = manager.open_block(view_id).await?; + let delta_bytes = Bytes::from(editor.delta_str().await?); + Ok(delta_bytes) }) } - fn default_view_data(&self, _view_id: &str) -> String { - initial_quill_delta_string() + fn create_default_view(&self, user_id: &str, view_id: &str) -> FutureResult { + let user_id = user_id.to_string(); + let view_id = view_id.to_string(); + let manager = self.0.clone(); + FutureResult::new(async move { + let view_data = initial_quill_delta_string(); + let delta_data = Bytes::from(view_data); + let repeated_revision: RepeatedRevision = + Revision::initial_revision(&user_id, &view_id, delta_data.clone()).into(); + let _ = manager.create_block(view_id, repeated_revision).await?; + Ok(delta_data) + }) + } + + fn process_create_view_data( + &self, + _user_id: &str, + _view_id: &str, + data: Vec, + ) -> FutureResult { + FutureResult::new(async move { Ok(Bytes::from(data)) }) } fn data_type(&self) -> ViewDataType { - ViewDataType::Block + ViewDataType::TextBlock } } -struct GridManagerViewDataImpl(Arc); -impl ViewDataProcessor for GridManagerViewDataImpl { +struct GridViewDataProcessor(Arc); +impl ViewDataProcessor for GridViewDataProcessor { fn initialize(&self) -> FutureResult<(), FlowyError> { FutureResult::new(async { Ok(()) }) } - fn create_container(&self, view_id: &str, repeated_revision: RepeatedRevision) -> FutureResult<(), FlowyError> { - let grid_manager = self.0.clone(); + fn create_container(&self, user_id: &str, view_id: &str, delta_data: Bytes) -> FutureResult<(), FlowyError> { + let repeated_revision: RepeatedRevision = Revision::initial_revision(user_id, view_id, delta_data).into(); let view_id = view_id.to_string(); + let grid_manager = self.0.clone(); FutureResult::new(async move { let _ = grid_manager.create_grid(view_id, repeated_revision).await?; Ok(()) @@ -216,18 +243,35 @@ impl ViewDataProcessor for GridManagerViewDataImpl { }) } - fn delta_str(&self, view_id: &str) -> FutureResult { + fn delta_bytes(&self, view_id: &str) -> FutureResult { let view_id = view_id.to_string(); let grid_manager = self.0.clone(); FutureResult::new(async move { let editor = grid_manager.open_grid(view_id).await?; - let delta_str = editor.delta_str().await; - Ok(delta_str) + let delta_bytes = editor.delta_bytes().await; + Ok(delta_bytes) }) } - fn default_view_data(&self, view_id: &str) -> String { - make_default_grid(view_id, self.0.clone()) + fn create_default_view(&self, user_id: &str, view_id: &str) -> FutureResult { + let build_context = make_default_grid(); + let user_id = user_id.to_string(); + let view_id = view_id.to_string(); + let grid_manager = self.0.clone(); + + FutureResult::new(async move { make_grid_view_data(&user_id, &view_id, grid_manager, build_context).await }) + } + + fn process_create_view_data(&self, user_id: &str, view_id: &str, data: Vec) -> FutureResult { + let user_id = user_id.to_string(); + let view_id = view_id.to_string(); + let grid_manager = self.0.clone(); + + FutureResult::new(async move { + let bytes = Bytes::from(data); + let build_context = BuildGridContext::try_from(bytes)?; + make_grid_view_data(&user_id, &view_id, grid_manager, build_context).await + }) } fn data_type(&self) -> ViewDataType { diff --git a/frontend/rust-lib/flowy-sdk/src/deps_resolve/mod.rs b/frontend/rust-lib/flowy-sdk/src/deps_resolve/mod.rs index c0a84d8d94..cac82f9c56 100644 --- a/frontend/rust-lib/flowy-sdk/src/deps_resolve/mod.rs +++ b/frontend/rust-lib/flowy-sdk/src/deps_resolve/mod.rs @@ -1,10 +1,10 @@ -mod block_deps; mod folder_deps; mod grid_deps; +mod text_block_deps; mod user_deps; mod util; -pub use block_deps::*; pub use folder_deps::*; pub use grid_deps::*; +pub use text_block_deps::*; pub use user_deps::*; diff --git a/frontend/rust-lib/flowy-sdk/src/deps_resolve/block_deps.rs b/frontend/rust-lib/flowy-sdk/src/deps_resolve/text_block_deps.rs similarity index 85% rename from frontend/rust-lib/flowy-sdk/src/deps_resolve/block_deps.rs rename to frontend/rust-lib/flowy-sdk/src/deps_resolve/text_block_deps.rs index f8c97d133c..5482bbe546 100644 --- a/frontend/rust-lib/flowy-sdk/src/deps_resolve/block_deps.rs +++ b/frontend/rust-lib/flowy-sdk/src/deps_resolve/text_block_deps.rs @@ -1,7 +1,7 @@ use bytes::Bytes; use flowy_block::{ errors::{internal_error, FlowyError}, - BlockCloudService, BlockManager, BlockUser, + BlockCloudService, TextBlockManager, TextBlockUser, }; use flowy_collaboration::entities::ws_data::ClientRevisionWSData; use flowy_database::ConnectionPool; @@ -16,22 +16,22 @@ use lib_infra::future::BoxResultFuture; use lib_ws::{WSChannel, WSMessageReceiver, WebSocketRawMessage}; use std::{convert::TryInto, path::Path, sync::Arc}; -pub struct BlockDepsResolver(); -impl BlockDepsResolver { +pub struct TextBlockDepsResolver(); +impl TextBlockDepsResolver { pub fn resolve( local_server: Option>, ws_conn: Arc, user_session: Arc, server_config: &ClientServerConfiguration, - ) -> Arc { + ) -> Arc { let user = Arc::new(BlockUserImpl(user_session)); - let rev_web_socket = Arc::new(BlockWebSocket(ws_conn.clone())); + let rev_web_socket = Arc::new(TextBlockWebSocket(ws_conn.clone())); let cloud_service: Arc = match local_server { None => Arc::new(BlockHttpCloudService::new(server_config.clone())), Some(local_server) => local_server, }; - let manager = Arc::new(BlockManager::new(cloud_service, user, rev_web_socket)); + let manager = Arc::new(TextBlockManager::new(cloud_service, user, rev_web_socket)); let receiver = Arc::new(DocumentWSMessageReceiverImpl(manager.clone())); ws_conn.add_ws_message_receiver(receiver).unwrap(); @@ -40,7 +40,7 @@ impl BlockDepsResolver { } struct BlockUserImpl(Arc); -impl BlockUser for BlockUserImpl { +impl TextBlockUser for BlockUserImpl { fn user_dir(&self) -> Result { let dir = self.0.user_dir().map_err(|e| FlowyError::unauthorized().context(e))?; @@ -64,8 +64,8 @@ impl BlockUser for BlockUserImpl { } } -struct BlockWebSocket(Arc); -impl RevisionWebSocket for BlockWebSocket { +struct TextBlockWebSocket(Arc); +impl RevisionWebSocket for TextBlockWebSocket { fn send(&self, data: ClientRevisionWSData) -> BoxResultFuture<(), FlowyError> { let bytes: Bytes = data.try_into().unwrap(); let msg = WebSocketRawMessage { @@ -90,7 +90,7 @@ impl RevisionWebSocket for BlockWebSocket { } } -struct DocumentWSMessageReceiverImpl(Arc); +struct DocumentWSMessageReceiverImpl(Arc); impl WSMessageReceiver for DocumentWSMessageReceiverImpl { fn source(&self) -> WSChannel { WSChannel::Document diff --git a/frontend/rust-lib/flowy-sdk/src/lib.rs b/frontend/rust-lib/flowy-sdk/src/lib.rs index 7c254acd66..7acf14952e 100644 --- a/frontend/rust-lib/flowy-sdk/src/lib.rs +++ b/frontend/rust-lib/flowy-sdk/src/lib.rs @@ -3,7 +3,7 @@ pub mod module; pub use flowy_net::get_client_server_configuration; use crate::deps_resolve::*; -use flowy_block::BlockManager; +use flowy_block::TextBlockManager; use flowy_folder::{errors::FlowyError, manager::FolderManager}; use flowy_grid::manager::GridManager; use flowy_net::ClientServerConfiguration; @@ -88,7 +88,7 @@ pub struct FlowySDK { #[allow(dead_code)] config: FlowySDKConfig, pub user_session: Arc, - pub block_manager: Arc, + pub text_block_manager: Arc, pub folder_manager: Arc, pub grid_manager: Arc, pub dispatcher: Arc, @@ -103,9 +103,9 @@ impl FlowySDK { tracing::debug!("🔥 {:?}", config); let runtime = tokio_default_runtime().unwrap(); let (local_server, ws_conn) = mk_local_server(&config.server_config); - let (user_session, block_manager, folder_manager, local_server, grid_manager) = runtime.block_on(async { + let (user_session, text_block_manager, folder_manager, local_server, grid_manager) = runtime.block_on(async { let user_session = mk_user_session(&config, &local_server, &config.server_config); - let block_manager = BlockDepsResolver::resolve( + let text_block_manager = TextBlockDepsResolver::resolve( local_server.clone(), ws_conn.clone(), user_session.clone(), @@ -119,7 +119,7 @@ impl FlowySDK { user_session.clone(), &config.server_config, &ws_conn, - &block_manager, + &text_block_manager, &grid_manager, ) .await; @@ -128,11 +128,23 @@ impl FlowySDK { local_server.run(); } ws_conn.init().await; - (user_session, block_manager, folder_manager, local_server, grid_manager) + ( + user_session, + text_block_manager, + folder_manager, + local_server, + grid_manager, + ) }); let dispatcher = Arc::new(EventDispatcher::construct(runtime, || { - mk_modules(&ws_conn, &folder_manager, &grid_manager, &user_session, &block_manager) + mk_modules( + &ws_conn, + &folder_manager, + &grid_manager, + &user_session, + &text_block_manager, + ) })); _start_listening(&dispatcher, &ws_conn, &user_session, &folder_manager); @@ -140,7 +152,7 @@ impl FlowySDK { Self { config, user_session, - block_manager, + text_block_manager, folder_manager, grid_manager, dispatcher, diff --git a/frontend/rust-lib/flowy-sdk/src/module.rs b/frontend/rust-lib/flowy-sdk/src/module.rs index 18bf44a2af..0a3fb1f87a 100644 --- a/frontend/rust-lib/flowy-sdk/src/module.rs +++ b/frontend/rust-lib/flowy-sdk/src/module.rs @@ -1,4 +1,4 @@ -use flowy_block::BlockManager; +use flowy_block::TextBlockManager; use flowy_folder::manager::FolderManager; use flowy_grid::manager::GridManager; use flowy_net::ws::connection::FlowyWebSocketConnect; @@ -11,14 +11,20 @@ pub fn mk_modules( folder_manager: &Arc, grid_manager: &Arc, user_session: &Arc, - block_manager: &Arc, + text_block_manager: &Arc, ) -> Vec { let user_module = mk_user_module(user_session.clone()); let folder_module = mk_folder_module(folder_manager.clone()); let network_module = mk_network_module(ws_conn.clone()); let grid_module = mk_grid_module(grid_manager.clone()); - let block_module = mk_block_module(block_manager.clone()); - vec![user_module, folder_module, network_module, grid_module, block_module] + let text_block_module = mk_text_block_module(text_block_manager.clone()); + vec![ + user_module, + folder_module, + network_module, + grid_module, + text_block_module, + ] } fn mk_user_module(user_session: Arc) -> Module { @@ -37,6 +43,6 @@ fn mk_grid_module(grid_manager: Arc) -> Module { flowy_grid::event_map::create(grid_manager) } -fn mk_block_module(block_manager: Arc) -> Module { - flowy_block::event_map::create(block_manager) +fn mk_text_block_module(text_block_manager: Arc) -> Module { + flowy_block::event_map::create(text_block_manager) } diff --git a/frontend/rust-lib/flowy-sync/src/cache/disk/folder_rev_impl.rs b/frontend/rust-lib/flowy-sync/src/cache/disk/folder_rev_impl.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frontend/rust-lib/flowy-sync/src/cache/disk/grid_meta_rev_impl.rs b/frontend/rust-lib/flowy-sync/src/cache/disk/grid_meta_rev_impl.rs new file mode 100644 index 0000000000..4cd46058bf --- /dev/null +++ b/frontend/rust-lib/flowy-sync/src/cache/disk/grid_meta_rev_impl.rs @@ -0,0 +1,235 @@ +use crate::cache::disk::RevisionDiskCache; +use crate::disk::{RevisionChangeset, RevisionRecord, RevisionState}; + +use bytes::Bytes; +use diesel::{sql_types::Integer, update, SqliteConnection}; +use flowy_collaboration::{ + entities::revision::{Revision, RevisionRange}, + util::md5, +}; +use flowy_database::{ + impl_sql_integer_expression, insert_or_ignore_into, + prelude::*, + schema::{grid_meta_rev_table, grid_meta_rev_table::dsl}, + ConnectionPool, +}; +use flowy_error::{internal_error, FlowyError, FlowyResult}; +use std::sync::Arc; + +pub struct SQLiteGridBlockMetaRevisionPersistence { + user_id: String, + pub(crate) pool: Arc, +} + +impl RevisionDiskCache for SQLiteGridBlockMetaRevisionPersistence { + type Error = FlowyError; + + fn create_revision_records(&self, revision_records: Vec) -> Result<(), Self::Error> { + let conn = self.pool.get().map_err(internal_error)?; + let _ = GridMetaRevisionSql::create(revision_records, &*conn)?; + Ok(()) + } + + fn read_revision_records( + &self, + object_id: &str, + rev_ids: Option>, + ) -> Result, Self::Error> { + let conn = self.pool.get().map_err(internal_error)?; + let records = GridMetaRevisionSql::read(&self.user_id, object_id, rev_ids, &*conn)?; + Ok(records) + } + + fn read_revision_records_with_range( + &self, + object_id: &str, + range: &RevisionRange, + ) -> Result, Self::Error> { + let conn = &*self.pool.get().map_err(internal_error)?; + let revisions = GridMetaRevisionSql::read_with_range(&self.user_id, object_id, range.clone(), conn)?; + Ok(revisions) + } + + fn update_revision_record(&self, changesets: Vec) -> FlowyResult<()> { + let conn = &*self.pool.get().map_err(internal_error)?; + let _ = conn.immediate_transaction::<_, FlowyError, _>(|| { + for changeset in changesets { + let _ = GridMetaRevisionSql::update(changeset, conn)?; + } + Ok(()) + })?; + Ok(()) + } + + fn delete_revision_records(&self, object_id: &str, rev_ids: Option>) -> Result<(), Self::Error> { + let conn = &*self.pool.get().map_err(internal_error)?; + let _ = GridMetaRevisionSql::delete(object_id, rev_ids, conn)?; + Ok(()) + } + + fn delete_and_insert_records( + &self, + object_id: &str, + deleted_rev_ids: Option>, + inserted_records: Vec, + ) -> Result<(), Self::Error> { + let conn = self.pool.get().map_err(internal_error)?; + conn.immediate_transaction::<_, FlowyError, _>(|| { + let _ = GridMetaRevisionSql::delete(object_id, deleted_rev_ids, &*conn)?; + let _ = GridMetaRevisionSql::create(inserted_records, &*conn)?; + Ok(()) + }) + } +} + +impl SQLiteGridBlockMetaRevisionPersistence { + pub fn new(user_id: &str, pool: Arc) -> Self { + Self { + user_id: user_id.to_owned(), + pool, + } + } +} + +struct GridMetaRevisionSql(); +impl GridMetaRevisionSql { + fn create(revision_records: Vec, conn: &SqliteConnection) -> Result<(), FlowyError> { + // Batch insert: https://diesel.rs/guides/all-about-inserts.html + + let records = revision_records + .into_iter() + .map(|record| { + tracing::trace!( + "[GridMetaRevisionSql] create revision: {}:{:?}", + record.revision.object_id, + record.revision.rev_id + ); + let rev_state: GridMetaRevisionState = record.state.into(); + ( + dsl::object_id.eq(record.revision.object_id), + dsl::base_rev_id.eq(record.revision.base_rev_id), + dsl::rev_id.eq(record.revision.rev_id), + dsl::data.eq(record.revision.delta_data), + dsl::state.eq(rev_state), + ) + }) + .collect::>(); + + let _ = insert_or_ignore_into(dsl::grid_meta_rev_table) + .values(&records) + .execute(conn)?; + Ok(()) + } + + fn update(changeset: RevisionChangeset, conn: &SqliteConnection) -> Result<(), FlowyError> { + let state: GridMetaRevisionState = changeset.state.clone().into(); + let filter = dsl::grid_meta_rev_table + .filter(dsl::rev_id.eq(changeset.rev_id.as_ref())) + .filter(dsl::object_id.eq(changeset.object_id)); + let _ = update(filter).set(dsl::state.eq(state)).execute(conn)?; + tracing::debug!( + "[GridMetaRevisionSql] update revision:{} state:to {:?}", + changeset.rev_id, + changeset.state + ); + Ok(()) + } + + fn read( + user_id: &str, + object_id: &str, + rev_ids: Option>, + conn: &SqliteConnection, + ) -> Result, FlowyError> { + let mut sql = dsl::grid_meta_rev_table + .filter(dsl::object_id.eq(object_id)) + .into_boxed(); + if let Some(rev_ids) = rev_ids { + sql = sql.filter(dsl::rev_id.eq_any(rev_ids)); + } + let rows = sql.order(dsl::rev_id.asc()).load::(conn)?; + let records = rows + .into_iter() + .map(|row| mk_revision_record_from_table(user_id, row)) + .collect::>(); + + Ok(records) + } + + fn read_with_range( + user_id: &str, + object_id: &str, + range: RevisionRange, + conn: &SqliteConnection, + ) -> Result, FlowyError> { + let rev_tables = dsl::grid_meta_rev_table + .filter(dsl::rev_id.ge(range.start)) + .filter(dsl::rev_id.le(range.end)) + .filter(dsl::object_id.eq(object_id)) + .order(dsl::rev_id.asc()) + .load::(conn)?; + + let revisions = rev_tables + .into_iter() + .map(|table| mk_revision_record_from_table(user_id, table)) + .collect::>(); + Ok(revisions) + } + + fn delete(object_id: &str, rev_ids: Option>, conn: &SqliteConnection) -> Result<(), FlowyError> { + let mut sql = diesel::delete(dsl::grid_meta_rev_table).into_boxed(); + sql = sql.filter(dsl::object_id.eq(object_id)); + + if let Some(rev_ids) = rev_ids { + tracing::trace!("[GridMetaRevisionSql] Delete revision: {}:{:?}", object_id, rev_ids); + sql = sql.filter(dsl::rev_id.eq_any(rev_ids)); + } + + let affected_row = sql.execute(conn)?; + tracing::trace!("[GridMetaRevisionSql] Delete {} rows", affected_row); + Ok(()) + } +} + +#[derive(PartialEq, Clone, Debug, Queryable, Identifiable, Insertable, Associations)] +#[table_name = "grid_meta_rev_table"] +struct GridMetaRevisionTable { + id: i32, + object_id: String, + base_rev_id: i64, + rev_id: i64, + data: Vec, + state: GridMetaRevisionState, +} + +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, FromSqlRow, AsExpression)] +#[repr(i32)] +#[sql_type = "Integer"] +pub enum GridMetaRevisionState { + Sync = 0, + Ack = 1, +} +impl_sql_integer_expression!(GridMetaRevisionState); +impl_rev_state_map!(GridMetaRevisionState); +impl std::default::Default for GridMetaRevisionState { + fn default() -> Self { + GridMetaRevisionState::Sync + } +} + +fn mk_revision_record_from_table(user_id: &str, table: GridMetaRevisionTable) -> RevisionRecord { + let md5 = md5(&table.data); + let revision = Revision::new( + &table.object_id, + table.base_rev_id, + table.rev_id, + Bytes::from(table.data), + user_id, + md5, + ); + RevisionRecord { + revision, + state: table.state.into(), + write_to_disk: false, + } +} diff --git a/frontend/rust-lib/flowy-sync/src/cache/disk/grid_rev_impl.rs b/frontend/rust-lib/flowy-sync/src/cache/disk/grid_rev_impl.rs new file mode 100644 index 0000000000..414bbb96c9 --- /dev/null +++ b/frontend/rust-lib/flowy-sync/src/cache/disk/grid_rev_impl.rs @@ -0,0 +1,234 @@ +use crate::cache::disk::RevisionDiskCache; +use crate::disk::{RevisionChangeset, RevisionRecord, RevisionState}; + +use bytes::Bytes; +use diesel::{sql_types::Integer, update, SqliteConnection}; +use flowy_collaboration::{ + entities::revision::{Revision, RevisionRange}, + util::md5, +}; +use flowy_database::{ + impl_sql_integer_expression, insert_or_ignore_into, + prelude::*, + schema::{grid_rev_table, grid_rev_table::dsl}, + ConnectionPool, +}; +use flowy_error::{internal_error, FlowyError, FlowyResult}; +use std::sync::Arc; + +pub struct SQLiteGridRevisionPersistence { + user_id: String, + pub(crate) pool: Arc, +} + +impl RevisionDiskCache for SQLiteGridRevisionPersistence { + type Error = FlowyError; + + fn create_revision_records(&self, revision_records: Vec) -> Result<(), Self::Error> { + let conn = self.pool.get().map_err(internal_error)?; + let _ = GridRevisionSql::create(revision_records, &*conn)?; + Ok(()) + } + + fn read_revision_records( + &self, + object_id: &str, + rev_ids: Option>, + ) -> Result, Self::Error> { + let conn = self.pool.get().map_err(internal_error)?; + let records = GridRevisionSql::read(&self.user_id, object_id, rev_ids, &*conn)?; + Ok(records) + } + + fn read_revision_records_with_range( + &self, + object_id: &str, + range: &RevisionRange, + ) -> Result, Self::Error> { + let conn = &*self.pool.get().map_err(internal_error)?; + let revisions = GridRevisionSql::read_with_range(&self.user_id, object_id, range.clone(), conn)?; + Ok(revisions) + } + + fn update_revision_record(&self, changesets: Vec) -> FlowyResult<()> { + let conn = &*self.pool.get().map_err(internal_error)?; + let _ = conn.immediate_transaction::<_, FlowyError, _>(|| { + for changeset in changesets { + let _ = GridRevisionSql::update(changeset, conn)?; + } + Ok(()) + })?; + Ok(()) + } + + fn delete_revision_records(&self, object_id: &str, rev_ids: Option>) -> Result<(), Self::Error> { + let conn = &*self.pool.get().map_err(internal_error)?; + let _ = GridRevisionSql::delete(object_id, rev_ids, conn)?; + Ok(()) + } + + fn delete_and_insert_records( + &self, + object_id: &str, + deleted_rev_ids: Option>, + inserted_records: Vec, + ) -> Result<(), Self::Error> { + let conn = self.pool.get().map_err(internal_error)?; + conn.immediate_transaction::<_, FlowyError, _>(|| { + let _ = GridRevisionSql::delete(object_id, deleted_rev_ids, &*conn)?; + let _ = GridRevisionSql::create(inserted_records, &*conn)?; + Ok(()) + }) + } +} + +impl SQLiteGridRevisionPersistence { + pub fn new(user_id: &str, pool: Arc) -> Self { + Self { + user_id: user_id.to_owned(), + pool, + } + } +} + +struct GridRevisionSql(); +impl GridRevisionSql { + fn create(revision_records: Vec, conn: &SqliteConnection) -> Result<(), FlowyError> { + // Batch insert: https://diesel.rs/guides/all-about-inserts.html + + let records = revision_records + .into_iter() + .map(|record| { + tracing::trace!( + "[GridRevisionSql] create revision: {}:{:?}", + record.revision.object_id, + record.revision.rev_id + ); + let rev_state: GridRevisionState = record.state.into(); + ( + dsl::object_id.eq(record.revision.object_id), + dsl::base_rev_id.eq(record.revision.base_rev_id), + dsl::rev_id.eq(record.revision.rev_id), + dsl::data.eq(record.revision.delta_data), + dsl::state.eq(rev_state), + ) + }) + .collect::>(); + + let _ = insert_or_ignore_into(dsl::grid_rev_table) + .values(&records) + .execute(conn)?; + Ok(()) + } + + fn update(changeset: RevisionChangeset, conn: &SqliteConnection) -> Result<(), FlowyError> { + let state: GridRevisionState = changeset.state.clone().into(); + let filter = dsl::grid_rev_table + .filter(dsl::rev_id.eq(changeset.rev_id.as_ref())) + .filter(dsl::object_id.eq(changeset.object_id)); + let _ = update(filter).set(dsl::state.eq(state)).execute(conn)?; + tracing::debug!( + "[GridRevisionSql] update revision:{} state:to {:?}", + changeset.rev_id, + changeset.state + ); + Ok(()) + } + + fn read( + user_id: &str, + object_id: &str, + rev_ids: Option>, + conn: &SqliteConnection, + ) -> Result, FlowyError> { + let mut sql = dsl::grid_rev_table.filter(dsl::object_id.eq(object_id)).into_boxed(); + if let Some(rev_ids) = rev_ids { + sql = sql.filter(dsl::rev_id.eq_any(rev_ids)); + } + let rows = sql.order(dsl::rev_id.asc()).load::(conn)?; + let records = rows + .into_iter() + .map(|row| mk_revision_record_from_table(user_id, row)) + .collect::>(); + + Ok(records) + } + + fn read_with_range( + user_id: &str, + object_id: &str, + range: RevisionRange, + conn: &SqliteConnection, + ) -> Result, FlowyError> { + let rev_tables = dsl::grid_rev_table + .filter(dsl::rev_id.ge(range.start)) + .filter(dsl::rev_id.le(range.end)) + .filter(dsl::object_id.eq(object_id)) + .order(dsl::rev_id.asc()) + .load::(conn)?; + + let revisions = rev_tables + .into_iter() + .map(|table| mk_revision_record_from_table(user_id, table)) + .collect::>(); + Ok(revisions) + } + + fn delete(object_id: &str, rev_ids: Option>, conn: &SqliteConnection) -> Result<(), FlowyError> { + let mut sql = diesel::delete(dsl::grid_rev_table).into_boxed(); + sql = sql.filter(dsl::object_id.eq(object_id)); + + if let Some(rev_ids) = rev_ids { + tracing::trace!("[GridRevisionSql] Delete revision: {}:{:?}", object_id, rev_ids); + sql = sql.filter(dsl::rev_id.eq_any(rev_ids)); + } + + let affected_row = sql.execute(conn)?; + tracing::trace!("[GridRevisionSql] Delete {} rows", affected_row); + Ok(()) + } +} + +#[derive(PartialEq, Clone, Debug, Queryable, Identifiable, Insertable, Associations)] +#[table_name = "grid_rev_table"] +struct GridRevisionTable { + id: i32, + object_id: String, + base_rev_id: i64, + rev_id: i64, + data: Vec, + state: GridRevisionState, +} + +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, FromSqlRow, AsExpression)] +#[repr(i32)] +#[sql_type = "Integer"] +pub enum GridRevisionState { + Sync = 0, + Ack = 1, +} +impl_sql_integer_expression!(GridRevisionState); +impl_rev_state_map!(GridRevisionState); + +impl std::default::Default for GridRevisionState { + fn default() -> Self { + GridRevisionState::Sync + } +} + +fn mk_revision_record_from_table(user_id: &str, table: GridRevisionTable) -> RevisionRecord { + let md5 = md5(&table.data); + let revision = Revision::new( + &table.object_id, + table.base_rev_id, + table.rev_id, + Bytes::from(table.data), + user_id, + md5, + ); + RevisionRecord { + revision, + state: table.state.into(), + write_to_disk: false, + } +} diff --git a/frontend/rust-lib/flowy-sync/src/cache/disk/mod.rs b/frontend/rust-lib/flowy-sync/src/cache/disk/mod.rs index 7bcbc30fdd..3a278afe36 100644 --- a/frontend/rust-lib/flowy-sync/src/cache/disk/mod.rs +++ b/frontend/rust-lib/flowy-sync/src/cache/disk/mod.rs @@ -1,19 +1,20 @@ -mod sql_impl; -use crate::RevisionRecord; -use diesel::SqliteConnection; -use flowy_collaboration::entities::revision::RevisionRange; -pub use sql_impl::*; +mod folder_rev_impl; +mod grid_meta_rev_impl; +mod grid_rev_impl; +mod text_rev_impl; +pub use folder_rev_impl::*; +pub use grid_meta_rev_impl::*; +pub use grid_rev_impl::*; +pub use text_rev_impl::*; + +use flowy_collaboration::entities::revision::{RevId, Revision, RevisionRange}; use flowy_error::FlowyResult; use std::fmt::Debug; pub trait RevisionDiskCache: Sync + Send { type Error: Debug; - fn create_revision_records( - &self, - revision_records: Vec, - conn: &SqliteConnection, - ) -> Result<(), Self::Error>; + fn create_revision_records(&self, revision_records: Vec) -> Result<(), Self::Error>; // Read all the records if the rev_ids is None fn read_revision_records( @@ -43,3 +44,43 @@ pub trait RevisionDiskCache: Sync + Send { inserted_records: Vec, ) -> Result<(), Self::Error>; } + +#[derive(Clone, Debug)] +pub struct RevisionRecord { + pub revision: Revision, + pub state: RevisionState, + pub write_to_disk: bool, +} + +impl RevisionRecord { + pub fn ack(&mut self) { + self.state = RevisionState::Ack; + } +} + +pub struct RevisionChangeset { + pub(crate) object_id: String, + pub(crate) rev_id: RevId, + pub(crate) state: RevisionState, +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum RevisionState { + Sync = 0, + Ack = 1, +} + +impl RevisionState { + pub fn is_need_sync(&self) -> bool { + match self { + RevisionState::Sync => true, + RevisionState::Ack => false, + } + } +} + +impl AsRef for RevisionState { + fn as_ref(&self) -> &RevisionState { + self + } +} diff --git a/frontend/rust-lib/flowy-sync/src/cache/disk/sql_impl.rs b/frontend/rust-lib/flowy-sync/src/cache/disk/text_rev_impl.rs similarity index 63% rename from frontend/rust-lib/flowy-sync/src/cache/disk/sql_impl.rs rename to frontend/rust-lib/flowy-sync/src/cache/disk/text_rev_impl.rs index e985a98bd8..13a8298916 100644 --- a/frontend/rust-lib/flowy-sync/src/cache/disk/sql_impl.rs +++ b/frontend/rust-lib/flowy-sync/src/cache/disk/text_rev_impl.rs @@ -1,8 +1,10 @@ -use crate::{cache::disk::RevisionDiskCache, RevisionRecord}; +use crate::cache::disk::RevisionDiskCache; +use crate::disk::{RevisionChangeset, RevisionRecord, RevisionState}; + use bytes::Bytes; use diesel::{sql_types::Integer, update, SqliteConnection}; use flowy_collaboration::{ - entities::revision::{RevId, RevType, Revision, RevisionRange, RevisionState}, + entities::revision::{RevType, Revision, RevisionRange}, util::md5, }; use flowy_database::{ @@ -14,20 +16,17 @@ use flowy_database::{ use flowy_error::{internal_error, FlowyError, FlowyResult}; use std::sync::Arc; -pub struct SQLitePersistence { +pub struct SQLiteTextBlockRevisionPersistence { user_id: String, pub(crate) pool: Arc, } -impl RevisionDiskCache for SQLitePersistence { +impl RevisionDiskCache for SQLiteTextBlockRevisionPersistence { type Error = FlowyError; - fn create_revision_records( - &self, - revision_records: Vec, - conn: &SqliteConnection, - ) -> Result<(), Self::Error> { - let _ = RevisionTableSql::create(revision_records, conn)?; + fn create_revision_records(&self, revision_records: Vec) -> Result<(), Self::Error> { + let conn = self.pool.get().map_err(internal_error)?; + let _ = TextRevisionSql::create(revision_records, &*conn)?; Ok(()) } @@ -37,7 +36,7 @@ impl RevisionDiskCache for SQLitePersistence { rev_ids: Option>, ) -> Result, Self::Error> { let conn = self.pool.get().map_err(internal_error)?; - let records = RevisionTableSql::read(&self.user_id, object_id, rev_ids, &*conn)?; + let records = TextRevisionSql::read(&self.user_id, object_id, rev_ids, &*conn)?; Ok(records) } @@ -47,7 +46,7 @@ impl RevisionDiskCache for SQLitePersistence { range: &RevisionRange, ) -> Result, Self::Error> { let conn = &*self.pool.get().map_err(internal_error)?; - let revisions = RevisionTableSql::read_with_range(&self.user_id, object_id, range.clone(), conn)?; + let revisions = TextRevisionSql::read_with_range(&self.user_id, object_id, range.clone(), conn)?; Ok(revisions) } @@ -55,7 +54,7 @@ impl RevisionDiskCache for SQLitePersistence { let conn = &*self.pool.get().map_err(internal_error)?; let _ = conn.immediate_transaction::<_, FlowyError, _>(|| { for changeset in changesets { - let _ = RevisionTableSql::update(changeset, conn)?; + let _ = TextRevisionSql::update(changeset, conn)?; } Ok(()) })?; @@ -64,7 +63,7 @@ impl RevisionDiskCache for SQLitePersistence { fn delete_revision_records(&self, object_id: &str, rev_ids: Option>) -> Result<(), Self::Error> { let conn = &*self.pool.get().map_err(internal_error)?; - let _ = RevisionTableSql::delete(object_id, rev_ids, conn)?; + let _ = TextRevisionSql::delete(object_id, rev_ids, conn)?; Ok(()) } @@ -76,15 +75,15 @@ impl RevisionDiskCache for SQLitePersistence { ) -> Result<(), Self::Error> { let conn = self.pool.get().map_err(internal_error)?; conn.immediate_transaction::<_, FlowyError, _>(|| { - let _ = RevisionTableSql::delete(object_id, deleted_rev_ids, &*conn)?; - let _ = self.create_revision_records(inserted_records, &*conn)?; + let _ = TextRevisionSql::delete(object_id, deleted_rev_ids, &*conn)?; + let _ = TextRevisionSql::create(inserted_records, &*conn)?; Ok(()) }) } } -impl SQLitePersistence { - pub(crate) fn new(user_id: &str, pool: Arc) -> Self { +impl SQLiteTextBlockRevisionPersistence { + pub fn new(user_id: &str, pool: Arc) -> Self { Self { user_id: user_id.to_owned(), pool, @@ -92,21 +91,21 @@ impl SQLitePersistence { } } -pub struct RevisionTableSql {} +struct TextRevisionSql {} -impl RevisionTableSql { - pub(crate) fn create(revision_records: Vec, conn: &SqliteConnection) -> Result<(), FlowyError> { +impl TextRevisionSql { + fn create(revision_records: Vec, conn: &SqliteConnection) -> Result<(), FlowyError> { // Batch insert: https://diesel.rs/guides/all-about-inserts.html let records = revision_records .into_iter() .map(|record| { tracing::trace!( - "[RevisionTable] create revision: {}:{:?}", + "[TextRevisionSql] create revision: {}:{:?}", record.revision.object_id, record.revision.rev_id ); - let rev_state: RevisionTableState = record.state.into(); + let rev_state: TextRevisionState = record.state.into(); ( dsl::doc_id.eq(record.revision.object_id), dsl::base_rev_id.eq(record.revision.base_rev_id), @@ -122,20 +121,21 @@ impl RevisionTableSql { Ok(()) } - pub(crate) fn update(changeset: RevisionChangeset, conn: &SqliteConnection) -> Result<(), FlowyError> { + fn update(changeset: RevisionChangeset, conn: &SqliteConnection) -> Result<(), FlowyError> { + let state: TextRevisionState = changeset.state.clone().into(); let filter = dsl::rev_table .filter(dsl::rev_id.eq(changeset.rev_id.as_ref())) .filter(dsl::doc_id.eq(changeset.object_id)); - let _ = update(filter).set(dsl::state.eq(changeset.state)).execute(conn)?; + let _ = update(filter).set(dsl::state.eq(state)).execute(conn)?; tracing::debug!( - "[RevisionTable] update revision:{} state:to {:?}", + "[TextRevisionSql] update revision:{} state:to {:?}", changeset.rev_id, changeset.state ); Ok(()) } - pub(crate) fn read( + fn read( user_id: &str, object_id: &str, rev_ids: Option>, @@ -154,7 +154,7 @@ impl RevisionTableSql { Ok(records) } - pub(crate) fn read_with_range( + fn read_with_range( user_id: &str, object_id: &str, range: RevisionRange, @@ -174,90 +174,50 @@ impl RevisionTableSql { Ok(revisions) } - pub(crate) fn delete( - object_id: &str, - rev_ids: Option>, - conn: &SqliteConnection, - ) -> Result<(), FlowyError> { + fn delete(object_id: &str, rev_ids: Option>, conn: &SqliteConnection) -> Result<(), FlowyError> { let mut sql = diesel::delete(dsl::rev_table).into_boxed(); sql = sql.filter(dsl::doc_id.eq(object_id)); if let Some(rev_ids) = rev_ids { - tracing::trace!("[RevisionTable] Delete revision: {}:{:?}", object_id, rev_ids); + tracing::trace!("[TextRevisionSql] Delete revision: {}:{:?}", object_id, rev_ids); sql = sql.filter(dsl::rev_id.eq_any(rev_ids)); } let affected_row = sql.execute(conn)?; - tracing::trace!("[RevisionTable] Delete {} rows", affected_row); + tracing::trace!("[TextRevisionSql] Delete {} rows", affected_row); Ok(()) } } #[derive(PartialEq, Clone, Debug, Queryable, Identifiable, Insertable, Associations)] #[table_name = "rev_table"] -pub(crate) struct RevisionTable { +struct RevisionTable { id: i32, - pub(crate) doc_id: String, - pub(crate) base_rev_id: i64, - pub(crate) rev_id: i64, - pub(crate) data: Vec, - pub(crate) state: RevisionTableState, - pub(crate) ty: RevTableType, // Deprecated + doc_id: String, + base_rev_id: i64, + rev_id: i64, + data: Vec, + state: TextRevisionState, + ty: RevTableType, // Deprecated } #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, FromSqlRow, AsExpression)] #[repr(i32)] #[sql_type = "Integer"] -pub enum RevisionTableState { +enum TextRevisionState { Sync = 0, Ack = 1, } +impl_sql_integer_expression!(TextRevisionState); +impl_rev_state_map!(TextRevisionState); -impl std::default::Default for RevisionTableState { +impl std::default::Default for TextRevisionState { fn default() -> Self { - RevisionTableState::Sync + TextRevisionState::Sync } } -impl std::convert::From for RevisionTableState { - fn from(value: i32) -> Self { - match value { - 0 => RevisionTableState::Sync, - 1 => RevisionTableState::Ack, - o => { - tracing::error!("Unsupported rev state {}, fallback to RevState::Local", o); - RevisionTableState::Sync - } - } - } -} - -impl RevisionTableState { - pub fn value(&self) -> i32 { - *self as i32 - } -} -impl_sql_integer_expression!(RevisionTableState); - -impl std::convert::From for RevisionState { - fn from(s: RevisionTableState) -> Self { - match s { - RevisionTableState::Sync => RevisionState::Sync, - RevisionTableState::Ack => RevisionState::Ack, - } - } -} - -impl std::convert::From for RevisionTableState { - fn from(s: RevisionState) -> Self { - match s { - RevisionState::Sync => RevisionTableState::Sync, - RevisionState::Ack => RevisionTableState::Ack, - } - } -} - -pub(crate) fn mk_revision_record_from_table(user_id: &str, table: RevisionTable) -> RevisionRecord { +fn mk_revision_record_from_table(user_id: &str, table: RevisionTable) -> RevisionRecord { let md5 = md5(&table.data); let revision = Revision::new( &table.doc_id, @@ -281,6 +241,7 @@ pub enum RevTableType { Local = 0, Remote = 1, } +impl_sql_integer_expression!(RevTableType); impl std::default::Default for RevTableType { fn default() -> Self { @@ -300,12 +261,6 @@ impl std::convert::From for RevTableType { } } } -impl RevTableType { - pub fn value(&self) -> i32 { - *self as i32 - } -} -impl_sql_integer_expression!(RevTableType); impl std::convert::From for RevTableType { fn from(ty: RevType) -> Self { @@ -324,9 +279,3 @@ impl std::convert::From for RevType { } } } - -pub struct RevisionChangeset { - pub(crate) object_id: String, - pub(crate) rev_id: RevId, - pub(crate) state: RevisionTableState, -} diff --git a/frontend/rust-lib/flowy-sync/src/cache/memory.rs b/frontend/rust-lib/flowy-sync/src/cache/memory.rs index 2c99c3f08c..f709abcdd2 100644 --- a/frontend/rust-lib/flowy-sync/src/cache/memory.rs +++ b/frontend/rust-lib/flowy-sync/src/cache/memory.rs @@ -1,4 +1,5 @@ -use crate::{RevisionRecord, REVISION_WRITE_INTERVAL_IN_MILLIS}; +use crate::disk::RevisionRecord; +use crate::REVISION_WRITE_INTERVAL_IN_MILLIS; use dashmap::DashMap; use flowy_collaboration::entities::revision::RevisionRange; use flowy_error::{FlowyError, FlowyResult}; diff --git a/frontend/rust-lib/flowy-sync/src/cache/mod.rs b/frontend/rust-lib/flowy-sync/src/cache/mod.rs index a6b5be4102..3e592c49b1 100644 --- a/frontend/rust-lib/flowy-sync/src/cache/mod.rs +++ b/frontend/rust-lib/flowy-sync/src/cache/mod.rs @@ -1,325 +1,2 @@ -mod disk; -mod memory; - -use crate::cache::{ - disk::{RevisionChangeset, RevisionDiskCache, RevisionTableState, SQLitePersistence}, - memory::{RevisionMemoryCache, RevisionMemoryCacheDelegate}, -}; - -use flowy_collaboration::entities::revision::{Revision, RevisionRange, RevisionState}; -use flowy_database::ConnectionPool; -use flowy_error::{internal_error, FlowyError, FlowyResult}; - -use crate::RevisionCompact; -use std::collections::VecDeque; -use std::{borrow::Cow, sync::Arc}; -use tokio::sync::RwLock; -use tokio::task::spawn_blocking; - -pub const REVISION_WRITE_INTERVAL_IN_MILLIS: u64 = 600; - -pub struct RevisionPersistence { - user_id: String, - object_id: String, - disk_cache: Arc>, - memory_cache: Arc, - sync_seq: RwLock, -} -impl RevisionPersistence { - pub fn new(user_id: &str, object_id: &str, pool: Arc) -> RevisionPersistence { - let disk_cache = Arc::new(SQLitePersistence::new(user_id, pool)); - let memory_cache = Arc::new(RevisionMemoryCache::new(object_id, Arc::new(disk_cache.clone()))); - let object_id = object_id.to_owned(); - let user_id = user_id.to_owned(); - let sync_seq = RwLock::new(RevisionSyncSequence::new()); - Self { - user_id, - object_id, - disk_cache, - memory_cache, - sync_seq, - } - } - - /// Save the revision that comes from remote to disk. - #[tracing::instrument(level = "trace", skip(self, revision), fields(rev_id, object_id=%self.object_id), err)] - pub(crate) async fn add_ack_revision(&self, revision: &Revision) -> FlowyResult<()> { - tracing::Span::current().record("rev_id", &revision.rev_id); - self.add(revision.clone(), RevisionState::Ack, true).await - } - - /// Append the revision that already existed in the local DB state to sync sequence - #[tracing::instrument(level = "trace", skip(self), fields(rev_id, object_id=%self.object_id), err)] - pub(crate) async fn sync_revision(&self, revision: &Revision) -> FlowyResult<()> { - tracing::Span::current().record("rev_id", &revision.rev_id); - self.add(revision.clone(), RevisionState::Sync, false).await?; - self.sync_seq.write().await.add(revision.rev_id)?; - Ok(()) - } - - /// Save the revision to disk and append it to the end of the sync sequence. - #[tracing::instrument(level = "trace", skip(self, revision), fields(rev_id, compact_range, object_id=%self.object_id), err)] - pub(crate) async fn add_sync_revision(&self, revision: &Revision) -> FlowyResult - where - C: RevisionCompact, - { - let result = self.sync_seq.read().await.compact(); - match result { - None => { - tracing::Span::current().record("rev_id", &revision.rev_id); - self.add(revision.clone(), RevisionState::Sync, true).await?; - self.sync_seq.write().await.add(revision.rev_id)?; - Ok(revision.rev_id) - } - Some((range, mut compact_seq)) => { - tracing::Span::current().record("compact_range", &format!("{}", range).as_str()); - let mut revisions = self.revisions_in_range(&range).await?; - if range.to_rev_ids().len() != revisions.len() { - debug_assert_eq!(range.to_rev_ids().len(), revisions.len()); - } - - // append the new revision - revisions.push(revision.clone()); - - // compact multiple revisions into one - let compact_revision = C::compact_revisions(&self.user_id, &self.object_id, revisions)?; - let rev_id = compact_revision.rev_id; - tracing::Span::current().record("rev_id", &rev_id); - - // insert new revision - compact_seq.push_back(rev_id); - - // replace the revisions in range with compact revision - self.compact(&range, compact_revision).await?; - debug_assert_eq!(self.sync_seq.read().await.len(), compact_seq.len()); - self.sync_seq.write().await.reset(compact_seq); - Ok(rev_id) - } - } - } - - /// Remove the revision with rev_id from the sync sequence. - pub(crate) async fn ack_revision(&self, rev_id: i64) -> FlowyResult<()> { - if self.sync_seq.write().await.ack(&rev_id).is_ok() { - self.memory_cache.ack(&rev_id).await; - } - Ok(()) - } - - pub(crate) async fn next_sync_revision(&self) -> FlowyResult> { - match self.sync_seq.read().await.next_rev_id() { - None => Ok(None), - Some(rev_id) => Ok(self.get(rev_id).await.map(|record| record.revision)), - } - } - - /// The cache gets reset while it conflicts with the remote revisions. - #[tracing::instrument(level = "trace", skip(self, revisions), err)] - pub(crate) async fn reset(&self, revisions: Vec) -> FlowyResult<()> { - let records = revisions - .to_vec() - .into_iter() - .map(|revision| RevisionRecord { - revision, - state: RevisionState::Sync, - write_to_disk: false, - }) - .collect::>(); - - let _ = self - .disk_cache - .delete_and_insert_records(&self.object_id, None, records.clone())?; - let _ = self.memory_cache.reset_with_revisions(records).await; - self.sync_seq.write().await.clear(); - Ok(()) - } - - async fn add(&self, revision: Revision, state: RevisionState, write_to_disk: bool) -> FlowyResult<()> { - if self.memory_cache.contains(&revision.rev_id) { - tracing::warn!("Duplicate revision: {}:{}-{:?}", self.object_id, revision.rev_id, state); - return Ok(()); - } - let record = RevisionRecord { - revision, - state, - write_to_disk, - }; - - self.memory_cache.add(Cow::Owned(record)).await; - Ok(()) - } - - async fn compact(&self, range: &RevisionRange, new_revision: Revision) -> FlowyResult<()> { - self.memory_cache.remove_with_range(range); - let rev_ids = range.to_rev_ids(); - let _ = self - .disk_cache - .delete_revision_records(&self.object_id, Some(rev_ids))?; - - self.add(new_revision, RevisionState::Sync, true).await?; - Ok(()) - } - - pub async fn get(&self, rev_id: i64) -> Option { - match self.memory_cache.get(&rev_id).await { - None => match self - .disk_cache - .read_revision_records(&self.object_id, Some(vec![rev_id])) - { - Ok(mut records) => { - let record = records.pop()?; - assert!(records.is_empty()); - Some(record) - } - Err(e) => { - tracing::error!("{}", e); - None - } - }, - Some(revision) => Some(revision), - } - } - - pub fn batch_get(&self, doc_id: &str) -> FlowyResult> { - self.disk_cache.read_revision_records(doc_id, None) - } - - // Read the revision which rev_id >= range.start && rev_id <= range.end - pub async fn revisions_in_range(&self, range: &RevisionRange) -> FlowyResult> { - let range = range.clone(); - let mut records = self.memory_cache.get_with_range(&range).await?; - let range_len = range.len() as usize; - if records.len() != range_len { - let disk_cache = self.disk_cache.clone(); - let object_id = self.object_id.clone(); - records = spawn_blocking(move || disk_cache.read_revision_records_with_range(&object_id, &range)) - .await - .map_err(internal_error)??; - - if records.len() != range_len { - // #[cfg(debug_assertions)] - // records.iter().for_each(|record| { - // let delta = PlainDelta::from_bytes(&record.revision.delta_data).unwrap(); - // tracing::trace!("{}", delta.to_string()); - // }); - tracing::error!("Expect revision len {},but receive {}", range_len, records.len()); - } - } - Ok(records - .into_iter() - .map(|record| record.revision) - .collect::>()) - } -} - -pub fn mk_revision_disk_cache( - user_id: &str, - pool: Arc, -) -> Arc> { - Arc::new(SQLitePersistence::new(user_id, pool)) -} - -impl RevisionMemoryCacheDelegate for Arc { - #[tracing::instrument(level = "trace", skip(self, records), fields(checkpoint_result), err)] - fn checkpoint_tick(&self, mut records: Vec) -> FlowyResult<()> { - let conn = &*self.pool.get().map_err(internal_error)?; - records.retain(|record| record.write_to_disk); - if !records.is_empty() { - tracing::Span::current().record( - "checkpoint_result", - &format!("{} records were saved", records.len()).as_str(), - ); - let _ = self.create_revision_records(records, conn)?; - } - Ok(()) - } - - fn receive_ack(&self, object_id: &str, rev_id: i64) { - let changeset = RevisionChangeset { - object_id: object_id.to_string(), - rev_id: rev_id.into(), - state: RevisionTableState::Ack, - }; - match self.update_revision_record(vec![changeset]) { - Ok(_) => {} - Err(e) => tracing::error!("{}", e), - } - } -} - -#[derive(Clone, Debug)] -pub struct RevisionRecord { - pub revision: Revision, - pub state: RevisionState, - pub write_to_disk: bool, -} - -impl RevisionRecord { - pub fn ack(&mut self) { - self.state = RevisionState::Ack; - } -} - -#[derive(Default)] -struct RevisionSyncSequence(VecDeque); -impl RevisionSyncSequence { - fn new() -> Self { - RevisionSyncSequence::default() - } - - fn add(&mut self, new_rev_id: i64) -> FlowyResult<()> { - // The last revision's rev_id must be greater than the new one. - if let Some(rev_id) = self.0.back() { - if *rev_id >= new_rev_id { - return Err( - FlowyError::internal().context(format!("The new revision's id must be greater than {}", rev_id)) - ); - } - } - self.0.push_back(new_rev_id); - Ok(()) - } - - fn ack(&mut self, rev_id: &i64) -> FlowyResult<()> { - let cur_rev_id = self.0.front().cloned(); - if let Some(pop_rev_id) = cur_rev_id { - if &pop_rev_id != rev_id { - let desc = format!( - "The ack rev_id:{} is not equal to the current rev_id:{}", - rev_id, pop_rev_id - ); - return Err(FlowyError::internal().context(desc)); - } - let _ = self.0.pop_front(); - } - Ok(()) - } - - fn next_rev_id(&self) -> Option { - self.0.front().cloned() - } - - fn reset(&mut self, new_seq: VecDeque) { - self.0 = new_seq; - } - - fn clear(&mut self) { - self.0.clear(); - } - - fn len(&self) -> usize { - self.0.len() - } - - // Compact the rev_ids into one except the current synchronizing rev_id. - fn compact(&self) -> Option<(RevisionRange, VecDeque)> { - self.next_rev_id()?; - - let mut new_seq = self.0.clone(); - let mut drained = new_seq.drain(1..).collect::>(); - - let start = drained.pop_front()?; - let end = drained.pop_back().unwrap_or(start); - Some((RevisionRange { start, end }, new_seq)) - } -} +pub mod disk; +pub(crate) mod memory; diff --git a/frontend/rust-lib/flowy-sync/src/conflict_resolve.rs b/frontend/rust-lib/flowy-sync/src/conflict_resolve.rs index 817b77bd88..a4f4f6c818 100644 --- a/frontend/rust-lib/flowy-sync/src/conflict_resolve.rs +++ b/frontend/rust-lib/flowy-sync/src/conflict_resolve.rs @@ -154,7 +154,7 @@ where &rev_manager.object_id, base_rev_id, rev_id, - client_delta.to_bytes(), + client_delta.to_delta_bytes(), user_id, md5.clone(), ); @@ -166,7 +166,7 @@ where &rev_manager.object_id, base_rev_id, rev_id, - server_delta.to_bytes(), + server_delta.to_delta_bytes(), user_id, md5, ); diff --git a/frontend/rust-lib/flowy-sync/src/lib.rs b/frontend/rust-lib/flowy-sync/src/lib.rs index 16cc05d2c7..05e60c00e0 100644 --- a/frontend/rust-lib/flowy-sync/src/lib.rs +++ b/frontend/rust-lib/flowy-sync/src/lib.rs @@ -1,11 +1,13 @@ mod cache; mod conflict_resolve; mod rev_manager; +mod rev_persistence; mod ws_manager; pub use cache::*; pub use conflict_resolve::*; pub use rev_manager::*; +pub use rev_persistence::*; pub use ws_manager::*; #[macro_use] diff --git a/frontend/rust-lib/flowy-sync/src/rev_manager.rs b/frontend/rust-lib/flowy-sync/src/rev_manager.rs index 5583690913..7b34bb8115 100644 --- a/frontend/rust-lib/flowy-sync/src/rev_manager.rs +++ b/frontend/rust-lib/flowy-sync/src/rev_manager.rs @@ -1,6 +1,8 @@ +use crate::disk::RevisionState; use crate::{RevisionPersistence, WSDataProviderDataSource}; +use bytes::Bytes; use flowy_collaboration::{ - entities::revision::{RepeatedRevision, Revision, RevisionRange, RevisionState}, + entities::revision::{RepeatedRevision, Revision, RevisionRange}, util::{pair_rev_id_from_revisions, RevIdCounter}, }; use flowy_error::{FlowyError, FlowyResult}; @@ -16,8 +18,26 @@ pub trait RevisionObjectBuilder: Send + Sync { fn build_object(object_id: &str, revisions: Vec) -> FlowyResult; } -pub trait RevisionCompact: Send + Sync { - fn compact_revisions(user_id: &str, object_id: &str, revisions: Vec) -> FlowyResult; +pub trait RevisionCompactor: Send + Sync { + fn compact(&self, user_id: &str, object_id: &str, mut revisions: Vec) -> FlowyResult { + if revisions.is_empty() { + return Err(FlowyError::internal().context("Can't compact the empty folder's revisions")); + } + + if revisions.len() == 1 { + return Ok(revisions.pop().unwrap()); + } + + let first_revision = revisions.first().unwrap(); + let last_revision = revisions.last().unwrap(); + + let (base_rev_id, rev_id) = first_revision.pair_rev_id(); + let md5 = last_revision.md5.clone(); + let delta_data = self.bytes_from_revisions(revisions)?; + Ok(Revision::new(object_id, base_rev_id, rev_id, delta_data, user_id, md5)) + } + + fn bytes_from_revisions(&self, revisions: Vec) -> FlowyResult; } pub struct RevisionManager { @@ -47,15 +67,14 @@ impl RevisionManager { } } - pub async fn load(&mut self, cloud: Arc) -> FlowyResult + pub async fn load(&mut self, cloud: Option>) -> FlowyResult where B: RevisionObjectBuilder, - C: RevisionCompact, { let (revisions, rev_id) = RevisionLoader { object_id: self.object_id.clone(), user_id: self.user_id.clone(), - cloud: Some(cloud), + cloud, rev_persistence: self.rev_persistence.clone(), } .load() @@ -83,15 +102,16 @@ impl RevisionManager { Ok(()) } - #[tracing::instrument(level = "debug", skip(self, revision))] - pub async fn add_local_revision(&self, revision: &Revision) -> Result<(), FlowyError> - where - C: RevisionCompact, - { + #[tracing::instrument(level = "debug", skip_all, err)] + pub async fn add_local_revision<'a>( + &'a self, + revision: &Revision, + compactor: Box, + ) -> Result<(), FlowyError> { if revision.delta_data.is_empty() { return Err(FlowyError::internal().context("Delta data should be empty")); } - let rev_id = self.rev_persistence.add_sync_revision::(revision).await?; + let rev_id = self.rev_persistence.add_sync_revision(revision, compactor).await?; self.rev_id_counter.set(rev_id); Ok(()) } diff --git a/frontend/rust-lib/flowy-sync/src/rev_persistence.rs b/frontend/rust-lib/flowy-sync/src/rev_persistence.rs new file mode 100644 index 0000000000..8a1d9647c4 --- /dev/null +++ b/frontend/rust-lib/flowy-sync/src/rev_persistence.rs @@ -0,0 +1,312 @@ +use crate::cache::{ + disk::{RevisionChangeset, RevisionDiskCache, SQLiteTextBlockRevisionPersistence}, + memory::RevisionMemoryCacheDelegate, +}; +use crate::disk::{RevisionRecord, RevisionState}; +use crate::memory::RevisionMemoryCache; +use crate::RevisionCompactor; +use flowy_collaboration::entities::revision::{Revision, RevisionRange}; +use flowy_database::ConnectionPool; +use flowy_error::{internal_error, FlowyError, FlowyResult}; +use std::collections::VecDeque; +use std::{borrow::Cow, sync::Arc}; +use tokio::sync::RwLock; +use tokio::task::spawn_blocking; + +pub const REVISION_WRITE_INTERVAL_IN_MILLIS: u64 = 600; + +pub struct RevisionPersistence { + user_id: String, + object_id: String, + disk_cache: Arc>, + memory_cache: Arc, + sync_seq: RwLock, +} + +impl RevisionPersistence { + pub fn new( + user_id: &str, + object_id: &str, + disk_cache: Arc>, + ) -> RevisionPersistence { + let object_id = object_id.to_owned(); + let user_id = user_id.to_owned(); + let sync_seq = RwLock::new(RevisionSyncSequence::new()); + let memory_cache = Arc::new(RevisionMemoryCache::new(&object_id, Arc::new(disk_cache.clone()))); + Self { + user_id, + object_id, + disk_cache, + memory_cache, + sync_seq, + } + } + + /// Save the revision that comes from remote to disk. + #[tracing::instrument(level = "trace", skip(self, revision), fields(rev_id, object_id=%self.object_id), err)] + pub(crate) async fn add_ack_revision(&self, revision: &Revision) -> FlowyResult<()> { + tracing::Span::current().record("rev_id", &revision.rev_id); + self.add(revision.clone(), RevisionState::Ack, true).await + } + + /// Append the revision that already existed in the local DB state to sync sequence + #[tracing::instrument(level = "trace", skip(self), fields(rev_id, object_id=%self.object_id), err)] + pub(crate) async fn sync_revision(&self, revision: &Revision) -> FlowyResult<()> { + tracing::Span::current().record("rev_id", &revision.rev_id); + self.add(revision.clone(), RevisionState::Sync, false).await?; + self.sync_seq.write().await.add(revision.rev_id)?; + Ok(()) + } + + /// Save the revision to disk and append it to the end of the sync sequence. + #[tracing::instrument(level = "trace", skip_all, fields(rev_id, compact_range, object_id=%self.object_id), err)] + pub(crate) async fn add_sync_revision<'a>( + &'a self, + revision: &'a Revision, + compactor: Box, + ) -> FlowyResult { + let result = self.sync_seq.read().await.compact(); + match result { + None => { + tracing::Span::current().record("rev_id", &revision.rev_id); + self.add(revision.clone(), RevisionState::Sync, true).await?; + self.sync_seq.write().await.add(revision.rev_id)?; + Ok(revision.rev_id) + } + Some((range, mut compact_seq)) => { + tracing::Span::current().record("compact_range", &format!("{}", range).as_str()); + let mut revisions = self.revisions_in_range(&range).await?; + if range.to_rev_ids().len() != revisions.len() { + debug_assert_eq!(range.to_rev_ids().len(), revisions.len()); + } + + // append the new revision + revisions.push(revision.clone()); + + // compact multiple revisions into one + let compact_revision = compactor.compact(&self.user_id, &self.object_id, revisions)?; + let rev_id = compact_revision.rev_id; + tracing::Span::current().record("rev_id", &rev_id); + + // insert new revision + compact_seq.push_back(rev_id); + + // replace the revisions in range with compact revision + self.compact(&range, compact_revision).await?; + debug_assert_eq!(self.sync_seq.read().await.len(), compact_seq.len()); + self.sync_seq.write().await.reset(compact_seq); + Ok(rev_id) + } + } + } + + /// Remove the revision with rev_id from the sync sequence. + pub(crate) async fn ack_revision(&self, rev_id: i64) -> FlowyResult<()> { + if self.sync_seq.write().await.ack(&rev_id).is_ok() { + self.memory_cache.ack(&rev_id).await; + } + Ok(()) + } + + pub(crate) async fn next_sync_revision(&self) -> FlowyResult> { + match self.sync_seq.read().await.next_rev_id() { + None => Ok(None), + Some(rev_id) => Ok(self.get(rev_id).await.map(|record| record.revision)), + } + } + + /// The cache gets reset while it conflicts with the remote revisions. + #[tracing::instrument(level = "trace", skip(self, revisions), err)] + pub(crate) async fn reset(&self, revisions: Vec) -> FlowyResult<()> { + let records = revisions + .to_vec() + .into_iter() + .map(|revision| RevisionRecord { + revision, + state: RevisionState::Sync, + write_to_disk: false, + }) + .collect::>(); + + let _ = self + .disk_cache + .delete_and_insert_records(&self.object_id, None, records.clone())?; + let _ = self.memory_cache.reset_with_revisions(records).await; + self.sync_seq.write().await.clear(); + Ok(()) + } + + async fn add(&self, revision: Revision, state: RevisionState, write_to_disk: bool) -> FlowyResult<()> { + if self.memory_cache.contains(&revision.rev_id) { + tracing::warn!("Duplicate revision: {}:{}-{:?}", self.object_id, revision.rev_id, state); + return Ok(()); + } + let record = RevisionRecord { + revision, + state, + write_to_disk, + }; + + self.memory_cache.add(Cow::Owned(record)).await; + Ok(()) + } + + async fn compact(&self, range: &RevisionRange, new_revision: Revision) -> FlowyResult<()> { + self.memory_cache.remove_with_range(range); + let rev_ids = range.to_rev_ids(); + let _ = self + .disk_cache + .delete_revision_records(&self.object_id, Some(rev_ids))?; + + self.add(new_revision, RevisionState::Sync, true).await?; + Ok(()) + } + + pub async fn get(&self, rev_id: i64) -> Option { + match self.memory_cache.get(&rev_id).await { + None => match self + .disk_cache + .read_revision_records(&self.object_id, Some(vec![rev_id])) + { + Ok(mut records) => { + let record = records.pop()?; + assert!(records.is_empty()); + Some(record) + } + Err(e) => { + tracing::error!("{}", e); + None + } + }, + Some(revision) => Some(revision), + } + } + + pub fn batch_get(&self, doc_id: &str) -> FlowyResult> { + self.disk_cache.read_revision_records(doc_id, None) + } + + // Read the revision which rev_id >= range.start && rev_id <= range.end + pub async fn revisions_in_range(&self, range: &RevisionRange) -> FlowyResult> { + let range = range.clone(); + let mut records = self.memory_cache.get_with_range(&range).await?; + let range_len = range.len() as usize; + if records.len() != range_len { + let disk_cache = self.disk_cache.clone(); + let object_id = self.object_id.clone(); + records = spawn_blocking(move || disk_cache.read_revision_records_with_range(&object_id, &range)) + .await + .map_err(internal_error)??; + + if records.len() != range_len { + // #[cfg(debug_assertions)] + // records.iter().for_each(|record| { + // let delta = PlainDelta::from_bytes(&record.revision.delta_data).unwrap(); + // tracing::trace!("{}", delta.to_string()); + // }); + tracing::error!("Expect revision len {},but receive {}", range_len, records.len()); + } + } + Ok(records + .into_iter() + .map(|record| record.revision) + .collect::>()) + } +} + +pub fn mk_revision_disk_cache( + user_id: &str, + pool: Arc, +) -> Arc> { + Arc::new(SQLiteTextBlockRevisionPersistence::new(user_id, pool)) +} + +impl RevisionMemoryCacheDelegate for Arc> { + fn checkpoint_tick(&self, mut records: Vec) -> FlowyResult<()> { + records.retain(|record| record.write_to_disk); + if !records.is_empty() { + tracing::Span::current().record( + "checkpoint_result", + &format!("{} records were saved", records.len()).as_str(), + ); + let _ = self.create_revision_records(records)?; + } + Ok(()) + } + + fn receive_ack(&self, object_id: &str, rev_id: i64) { + let changeset = RevisionChangeset { + object_id: object_id.to_string(), + rev_id: rev_id.into(), + state: RevisionState::Ack, + }; + match self.update_revision_record(vec![changeset]) { + Ok(_) => {} + Err(e) => tracing::error!("{}", e), + } + } +} + +#[derive(Default)] +struct RevisionSyncSequence(VecDeque); +impl RevisionSyncSequence { + fn new() -> Self { + RevisionSyncSequence::default() + } + + fn add(&mut self, new_rev_id: i64) -> FlowyResult<()> { + // The last revision's rev_id must be greater than the new one. + if let Some(rev_id) = self.0.back() { + if *rev_id >= new_rev_id { + return Err( + FlowyError::internal().context(format!("The new revision's id must be greater than {}", rev_id)) + ); + } + } + self.0.push_back(new_rev_id); + Ok(()) + } + + fn ack(&mut self, rev_id: &i64) -> FlowyResult<()> { + let cur_rev_id = self.0.front().cloned(); + if let Some(pop_rev_id) = cur_rev_id { + if &pop_rev_id != rev_id { + let desc = format!( + "The ack rev_id:{} is not equal to the current rev_id:{}", + rev_id, pop_rev_id + ); + return Err(FlowyError::internal().context(desc)); + } + let _ = self.0.pop_front(); + } + Ok(()) + } + + fn next_rev_id(&self) -> Option { + self.0.front().cloned() + } + + fn reset(&mut self, new_seq: VecDeque) { + self.0 = new_seq; + } + + fn clear(&mut self) { + self.0.clear(); + } + + fn len(&self) -> usize { + self.0.len() + } + + // Compact the rev_ids into one except the current synchronizing rev_id. + fn compact(&self) -> Option<(RevisionRange, VecDeque)> { + self.next_rev_id()?; + + let mut new_seq = self.0.clone(); + let mut drained = new_seq.drain(1..).collect::>(); + + let start = drained.pop_front()?; + let end = drained.pop_back().unwrap_or(start); + Some((RevisionRange { start, end }, new_seq)) + } +} diff --git a/frontend/rust-lib/flowy-test/src/helper.rs b/frontend/rust-lib/flowy-test/src/helper.rs index f28f7d35b0..f83f245754 100644 --- a/frontend/rust-lib/flowy-test/src/helper.rs +++ b/frontend/rust-lib/flowy-test/src/helper.rs @@ -25,11 +25,12 @@ pub struct ViewTest { } impl ViewTest { - pub async fn new(sdk: &FlowySDKTest) -> Self { + #[allow(dead_code)] + pub async fn new(sdk: &FlowySDKTest, data_type: ViewDataType, data: Vec) -> Self { let workspace = create_workspace(sdk, "Workspace", "").await; open_workspace(sdk, &workspace.id).await; let app = create_app(sdk, "App", "AppFlowy GitHub Project", &workspace.id).await; - let view = create_view(sdk, &app.id).await; + let view = create_view(sdk, &app.id, data_type, data).await; Self { sdk: sdk.clone(), workspace, @@ -37,6 +38,14 @@ impl ViewTest { view, } } + + pub async fn new_grid_view(sdk: &FlowySDKTest, data: Vec) -> Self { + Self::new(sdk, ViewDataType::Grid, data).await + } + + pub async fn new_text_block_view(sdk: &FlowySDKTest) -> Self { + Self::new(sdk, ViewDataType::TextBlock, vec![]).await + } } async fn create_workspace(sdk: &FlowySDKTest, name: &str, desc: &str) -> Workspace { @@ -82,15 +91,15 @@ async fn create_app(sdk: &FlowySDKTest, name: &str, desc: &str, workspace_id: &s app } -async fn create_view(sdk: &FlowySDKTest, app_id: &str) -> View { +async fn create_view(sdk: &FlowySDKTest, app_id: &str, data_type: ViewDataType, data: Vec) -> View { let request = CreateViewPayload { belong_to_id: app_id.to_string(), name: "View A".to_string(), desc: "".to_string(), thumbnail: Some("http://1.png".to_string()), - data_type: ViewDataType::Block, - ext_data: "".to_string(), + data_type, plugin_type: 0, + data, }; let view = FolderEventBuilder::new(sdk.clone()) diff --git a/shared-lib/Cargo.lock b/shared-lib/Cargo.lock index 3c859d28f0..a4cde5ddf2 100644 --- a/shared-lib/Cargo.lock +++ b/shared-lib/Cargo.lock @@ -485,6 +485,7 @@ version = "0.1.0" dependencies = [ "bytes", "flowy-derive", + "flowy-error-code", "lib-infra", "protobuf", "serde", diff --git a/shared-lib/flowy-collaboration/src/client_document/default/mod.rs b/shared-lib/flowy-collaboration/src/client_document/default/mod.rs index be6b679c81..f5fb180571 100644 --- a/shared-lib/flowy-collaboration/src/client_document/default/mod.rs +++ b/shared-lib/flowy-collaboration/src/client_document/default/mod.rs @@ -13,7 +13,7 @@ pub fn initial_quill_delta_string() -> String { #[inline] pub fn initial_read_me() -> RichTextDelta { let json = include_str!("READ_ME.json"); - RichTextDelta::from_json(json).unwrap() + RichTextDelta::from_delta_str(json).unwrap() } #[cfg(test)] diff --git a/shared-lib/flowy-collaboration/src/client_document/document_pad.rs b/shared-lib/flowy-collaboration/src/client_document/document_pad.rs index 0a537a8c8d..72b52f6415 100644 --- a/shared-lib/flowy-collaboration/src/client_document/document_pad.rs +++ b/shared-lib/flowy-collaboration/src/client_document/document_pad.rs @@ -6,6 +6,7 @@ use crate::{ }, errors::CollaborateError, }; +use bytes::Bytes; use lib_ot::{ core::*, rich_text::{RichTextAttribute, RichTextDelta}, @@ -54,7 +55,7 @@ impl ClientDocument { } pub fn from_json(json: &str) -> Result { - let delta = RichTextDelta::from_json(json)?; + let delta = RichTextDelta::from_delta_str(json)?; Ok(Self::from_delta(delta)) } @@ -62,8 +63,8 @@ impl ClientDocument { self.delta.to_delta_str() } - pub fn to_bytes(&self) -> Vec { - self.delta.clone().to_bytes().to_vec() + pub fn to_bytes(&self) -> Bytes { + self.delta.to_delta_bytes() } pub fn to_plain_string(&self) -> String { diff --git a/shared-lib/flowy-collaboration/src/client_folder/folder_pad.rs b/shared-lib/flowy-collaboration/src/client_folder/folder_pad.rs index 455f12c002..fd79fb8af0 100644 --- a/shared-lib/flowy-collaboration/src/client_folder/folder_pad.rs +++ b/shared-lib/flowy-collaboration/src/client_folder/folder_pad.rs @@ -268,7 +268,7 @@ impl FolderPad { } pub fn md5(&self) -> String { - md5(&self.delta.to_bytes()) + md5(&self.delta.to_delta_bytes()) } pub fn to_json(&self) -> CollaborateResult { @@ -307,7 +307,7 @@ impl FolderPad { if let Some(workspace) = workspaces.iter_mut().find(|workspace| workspace_id == workspace.id) { f(Arc::make_mut(workspace)) } else { - tracing::warn!("[RootFolder]: Can't find any workspace with id: {}", workspace_id); + tracing::warn!("[FolderPad]: Can't find any workspace with id: {}", workspace_id); Ok(None) } }) @@ -344,7 +344,7 @@ impl FolderPad { .find(|workspace| workspace.apps.iter().any(|app| app.id == app_id)) { None => { - tracing::warn!("[RootFolder]: Can't find any app with id: {}", app_id); + tracing::warn!("[FolderPad]: Can't find any app with id: {}", app_id); return Ok(None); } Some(workspace) => workspace.id.clone(), @@ -363,7 +363,7 @@ impl FolderPad { self.with_app(belong_to_id, |app| { match app.belongings.iter_mut().find(|view| view_id == view.id) { None => { - tracing::warn!("[RootFolder]: Can't find any view with id: {}", view_id); + tracing::warn!("[FolderPad]: Can't find any view with id: {}", view_id); Ok(None) } Some(view) => f(view), diff --git a/shared-lib/flowy-collaboration/src/client_grid/grid_block_meta_pad.rs b/shared-lib/flowy-collaboration/src/client_grid/grid_block_meta_pad.rs new file mode 100644 index 0000000000..7bfef998c2 --- /dev/null +++ b/shared-lib/flowy-collaboration/src/client_grid/grid_block_meta_pad.rs @@ -0,0 +1,370 @@ +use crate::entities::revision::{md5, RepeatedRevision, Revision}; +use crate::errors::{CollaborateError, CollaborateResult}; +use crate::util::{cal_diff, make_delta_from_revisions}; +use flowy_grid_data_model::entities::{GridBlockMetaSerde, RowMeta, RowMetaChangeset}; +use lib_infra::uuid; +use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::sync::Arc; + +pub type GridBlockMetaDelta = PlainTextDelta; +pub type GridBlockMetaDeltaBuilder = PlainTextDeltaBuilder; + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct GridBlockMetaPad { + block_id: String, + row_metas: Vec>, + + #[serde(skip)] + pub(crate) delta: GridBlockMetaDelta, +} + +impl GridBlockMetaPad { + pub fn from_delta(delta: GridBlockMetaDelta) -> CollaborateResult { + let s = delta.to_str()?; + tracing::info!("delta: {}", delta); + tracing::info!("{}", s); + let block_meta: GridBlockMetaSerde = serde_json::from_str(&s).map_err(|e| { + let msg = format!("Deserialize delta to block meta failed: {}", e); + CollaborateError::internal().context(msg) + })?; + let block_id = block_meta.block_id; + let rows = block_meta + .row_metas + .into_iter() + .map(Arc::new) + .collect::>>(); + Ok(Self { + block_id, + row_metas: rows, + delta, + }) + } + + pub fn from_revisions(_grid_id: &str, revisions: Vec) -> CollaborateResult { + let block_delta: GridBlockMetaDelta = make_delta_from_revisions::(revisions)?; + Self::from_delta(block_delta) + } + + pub fn add_row( + &mut self, + row: RowMeta, + start_row_id: Option, + ) -> CollaborateResult> { + self.modify(|rows| { + if let Some(upper_row_id) = start_row_id { + if upper_row_id.is_empty() { + rows.insert(0, Arc::new(row)); + return Ok(Some(())); + } + + if let Some(index) = rows.iter().position(|row| row.id == upper_row_id) { + rows.insert(index, Arc::new(row)); + return Ok(Some(())); + } + } + + rows.push(Arc::new(row)); + Ok(Some(())) + }) + } + + pub fn delete_rows(&mut self, row_ids: &[String]) -> CollaborateResult> { + self.modify(|rows| { + rows.retain(|row| !row_ids.contains(&row.id)); + Ok(Some(())) + }) + } + + pub fn get_rows(&self, row_ids: Option>) -> CollaborateResult>> { + match row_ids { + None => Ok(self.row_metas.to_vec()), + Some(row_ids) => { + let row_map = self + .row_metas + .iter() + .map(|row| (&row.id, row.clone())) + .collect::>>(); + + Ok(row_ids + .iter() + .flat_map(|row_id| match row_map.get(row_id) { + None => { + tracing::error!("Can't find the row with id: {}", row_id); + None + } + Some(row) => Some(row.clone()), + }) + .collect::>()) + } + } + } + + pub fn number_of_rows(&self) -> i32 { + self.row_metas.len() as i32 + } + + pub fn update_row(&mut self, changeset: RowMetaChangeset) -> CollaborateResult> { + let row_id = changeset.row_id.clone(); + self.modify_row(&row_id, |row| { + let mut is_changed = None; + if let Some(height) = changeset.height { + row.height = height; + is_changed = Some(()); + } + + if let Some(visibility) = changeset.visibility { + row.visibility = visibility; + is_changed = Some(()); + } + + if !changeset.cell_by_field_id.is_empty() { + is_changed = Some(()); + changeset.cell_by_field_id.into_iter().for_each(|(field_id, cell)| { + row.cell_by_field_id.insert(field_id, cell); + }) + } + + Ok(is_changed) + }) + } + + pub fn modify(&mut self, f: F) -> CollaborateResult> + where + F: for<'a> FnOnce(&'a mut Vec>) -> CollaborateResult>, + { + let cloned_self = self.clone(); + match f(&mut self.row_metas)? { + None => Ok(None), + Some(_) => { + let old = cloned_self.to_json()?; + let new = self.to_json()?; + match cal_diff::(old, new) { + None => Ok(None), + Some(delta) => { + self.delta = self.delta.compose(&delta)?; + Ok(Some(GridBlockMetaChange { delta, md5: self.md5() })) + } + } + } + } + } + + fn modify_row(&mut self, row_id: &str, f: F) -> CollaborateResult> + where + F: FnOnce(&mut RowMeta) -> CollaborateResult>, + { + self.modify(|rows| { + if let Some(row_meta) = rows.iter_mut().find(|row_meta| row_id == row_meta.id) { + f(Arc::make_mut(row_meta)) + } else { + tracing::warn!("[BlockMetaPad]: Can't find any row with id: {}", row_id); + Ok(None) + } + }) + } + + pub fn to_json(&self) -> CollaborateResult { + serde_json::to_string(self) + .map_err(|e| CollaborateError::internal().context(format!("serial trash to json failed: {}", e))) + } + + pub fn md5(&self) -> String { + md5(&self.delta.to_delta_bytes()) + } + + pub fn delta_str(&self) -> String { + self.delta.to_delta_str() + } +} + +pub struct GridBlockMetaChange { + pub delta: GridBlockMetaDelta, + /// md5: the md5 of the grid after applying the change. + pub md5: String, +} + +pub fn make_block_meta_delta(grid_block_meta_data: &GridBlockMetaSerde) -> GridBlockMetaDelta { + let json = serde_json::to_string(&grid_block_meta_data).unwrap(); + PlainTextDeltaBuilder::new().insert(&json).build() +} + +pub fn make_block_meta_revisions(user_id: &str, grid_block_meta_data: &GridBlockMetaSerde) -> RepeatedRevision { + let delta = make_block_meta_delta(grid_block_meta_data); + let bytes = delta.to_delta_bytes(); + let revision = Revision::initial_revision(user_id, &grid_block_meta_data.block_id, bytes); + revision.into() +} + +impl std::default::Default for GridBlockMetaPad { + fn default() -> Self { + let block_meta_data = GridBlockMetaSerde { + block_id: uuid(), + row_metas: vec![], + }; + + let delta = make_block_meta_delta(&block_meta_data); + GridBlockMetaPad { + block_id: block_meta_data.block_id, + row_metas: block_meta_data.row_metas.into_iter().map(Arc::new).collect::>(), + delta, + } + } +} + +#[cfg(test)] +mod tests { + use crate::client_grid::{GridBlockMetaDelta, GridBlockMetaPad}; + use flowy_grid_data_model::entities::{RowMeta, RowMetaChangeset}; + + #[test] + fn block_meta_add_row() { + let mut pad = test_pad(); + let row = RowMeta { + id: "1".to_string(), + block_id: pad.block_id.clone(), + cell_by_field_id: Default::default(), + height: 0, + visibility: false, + }; + + let change = pad.add_row(row, None).unwrap().unwrap(); + assert_eq!( + change.delta.to_delta_str(), + r#"[{"retain":29},{"insert":"{\"id\":\"1\",\"block_id\":\"1\",\"cell_by_field_id\":{},\"height\":0,\"visibility\":false}"},{"retain":2}]"# + ); + } + + #[test] + fn block_meta_insert_row() { + let mut pad = test_pad(); + let row_1 = test_row_meta("1", &pad); + let row_2 = test_row_meta("2", &pad); + let row_3 = test_row_meta("3", &pad); + + let change = pad.add_row(row_1.clone(), None).unwrap().unwrap(); + assert_eq!( + change.delta.to_delta_str(), + r#"[{"retain":29},{"insert":"{\"id\":\"1\",\"block_id\":\"1\",\"cell_by_field_id\":{},\"height\":0,\"visibility\":false}"},{"retain":2}]"# + ); + + let change = pad.add_row(row_2.clone(), None).unwrap().unwrap(); + assert_eq!( + change.delta.to_delta_str(), + r#"[{"retain":106},{"insert":",{\"id\":\"2\",\"block_id\":\"1\",\"cell_by_field_id\":{},\"height\":0,\"visibility\":false}"},{"retain":2}]"# + ); + + let change = pad.add_row(row_3.clone(), Some("2".to_string())).unwrap().unwrap(); + assert_eq!( + change.delta.to_delta_str(), + r#"[{"retain":114},{"insert":"3\",\"block_id\":\"1\",\"cell_by_field_id\":{},\"height\":0,\"visibility\":false},{\"id\":\""},{"retain":72}]"# + ); + + assert_eq!(*pad.row_metas[0], row_1); + assert_eq!(*pad.row_metas[1], row_3); + assert_eq!(*pad.row_metas[2], row_2); + } + + fn test_row_meta(id: &str, pad: &GridBlockMetaPad) -> RowMeta { + RowMeta { + id: id.to_string(), + block_id: pad.block_id.clone(), + cell_by_field_id: Default::default(), + height: 0, + visibility: false, + } + } + + #[test] + fn block_meta_insert_row2() { + let mut pad = test_pad(); + let row_1 = test_row_meta("1", &pad); + let row_2 = test_row_meta("2", &pad); + let row_3 = test_row_meta("3", &pad); + + let _ = pad.add_row(row_1.clone(), None).unwrap().unwrap(); + let _ = pad.add_row(row_2.clone(), None).unwrap().unwrap(); + let _ = pad.add_row(row_3.clone(), Some("1".to_string())).unwrap().unwrap(); + + assert_eq!(*pad.row_metas[0], row_3); + assert_eq!(*pad.row_metas[1], row_1); + assert_eq!(*pad.row_metas[2], row_2); + } + + #[test] + fn block_meta_insert_row3() { + let mut pad = test_pad(); + let row_1 = test_row_meta("1", &pad); + let row_2 = test_row_meta("2", &pad); + let row_3 = test_row_meta("3", &pad); + + let _ = pad.add_row(row_1.clone(), None).unwrap().unwrap(); + let _ = pad.add_row(row_2.clone(), None).unwrap().unwrap(); + let _ = pad.add_row(row_3.clone(), Some("".to_string())).unwrap().unwrap(); + + assert_eq!(*pad.row_metas[0], row_3); + assert_eq!(*pad.row_metas[1], row_1); + assert_eq!(*pad.row_metas[2], row_2); + } + + #[test] + fn block_meta_delete_row() { + let mut pad = test_pad(); + let pre_delta_str = pad.delta_str(); + let row = RowMeta { + id: "1".to_string(), + block_id: pad.block_id.clone(), + cell_by_field_id: Default::default(), + height: 0, + visibility: false, + }; + + let _ = pad.add_row(row.clone(), None).unwrap().unwrap(); + let change = pad.delete_rows(&[row.id]).unwrap().unwrap(); + assert_eq!( + change.delta.to_delta_str(), + r#"[{"retain":29},{"delete":77},{"retain":2}]"# + ); + + assert_eq!(pad.delta_str(), pre_delta_str); + } + + #[test] + fn block_meta_update_row() { + let mut pad = test_pad(); + let row = RowMeta { + id: "1".to_string(), + block_id: pad.block_id.clone(), + cell_by_field_id: Default::default(), + height: 0, + visibility: false, + }; + + let changeset = RowMetaChangeset { + row_id: row.id.clone(), + height: Some(100), + visibility: Some(true), + cell_by_field_id: Default::default(), + }; + + let _ = pad.add_row(row, None).unwrap().unwrap(); + let change = pad.update_row(changeset).unwrap().unwrap(); + + assert_eq!( + change.delta.to_delta_str(), + r#"[{"retain":85},{"insert":"10"},{"retain":15},{"insert":"tru"},{"delete":4},{"retain":4}]"# + ); + + assert_eq!( + pad.to_json().unwrap(), + r#"{"block_id":"1","row_metas":[{"id":"1","block_id":"1","cell_by_field_id":{},"height":100,"visibility":true}]}"# + ); + } + + fn test_pad() -> GridBlockMetaPad { + let delta = + GridBlockMetaDelta::from_delta_str(r#"[{"insert":"{\"block_id\":\"1\",\"row_metas\":[]}"}]"#).unwrap(); + GridBlockMetaPad::from_delta(delta).unwrap() + } +} diff --git a/shared-lib/flowy-collaboration/src/client_grid/grid_builder.rs b/shared-lib/flowy-collaboration/src/client_grid/grid_builder.rs new file mode 100644 index 0000000000..2875a8968c --- /dev/null +++ b/shared-lib/flowy-collaboration/src/client_grid/grid_builder.rs @@ -0,0 +1,69 @@ +use crate::errors::{CollaborateError, CollaborateResult}; +use flowy_grid_data_model::entities::{BuildGridContext, FieldMeta, RowMeta}; + +#[derive(Default)] +pub struct GridBuilder { + build_context: BuildGridContext, +} + +impl GridBuilder { + pub fn add_field(mut self, field: FieldMeta) -> Self { + self.build_context.field_metas.push(field); + self + } + + pub fn add_empty_row(mut self) -> Self { + let row = RowMeta::new(&self.build_context.block_metas.block_id); + self.build_context.block_meta_data.row_metas.push(row); + self.build_context.block_metas.row_count += 1; + self + } + + pub fn build(self) -> BuildGridContext { + self.build_context + } +} + +#[allow(dead_code)] +fn check_rows(fields: &[FieldMeta], rows: &[RowMeta]) -> CollaborateResult<()> { + let field_ids = fields.iter().map(|field| &field.id).collect::>(); + for row in rows { + let cell_field_ids = row.cell_by_field_id.keys().into_iter().collect::>(); + if cell_field_ids != field_ids { + let msg = format!("{:?} contains invalid cells", row); + return Err(CollaborateError::internal().context(msg)); + } + } + Ok(()) +} + +#[cfg(test)] +mod tests { + + use crate::client_grid::{make_block_meta_delta, make_grid_delta, GridBuilder}; + use flowy_grid_data_model::entities::{FieldMeta, FieldType, GridBlockMetaSerde, GridMeta}; + + #[test] + fn create_default_grid_test() { + let grid_id = "1".to_owned(); + let build_context = GridBuilder::default() + .add_field(FieldMeta::new("Name", "", FieldType::RichText)) + .add_field(FieldMeta::new("Tags", "", FieldType::SingleSelect)) + .add_empty_row() + .add_empty_row() + .add_empty_row() + .build(); + + let grid_meta = GridMeta { + grid_id, + fields: build_context.field_metas, + block_metas: vec![build_context.block_metas], + }; + + let grid_meta_delta = make_grid_delta(&grid_meta); + let _: GridMeta = serde_json::from_str(&grid_meta_delta.to_str().unwrap()).unwrap(); + + let grid_block_meta_delta = make_block_meta_delta(&build_context.block_meta_data); + let _: GridBlockMetaSerde = serde_json::from_str(&grid_block_meta_delta.to_str().unwrap()).unwrap(); + } +} diff --git a/shared-lib/flowy-collaboration/src/client_grid/grid_meta_pad.rs b/shared-lib/flowy-collaboration/src/client_grid/grid_meta_pad.rs new file mode 100644 index 0000000000..8d4ab37b6d --- /dev/null +++ b/shared-lib/flowy-collaboration/src/client_grid/grid_meta_pad.rs @@ -0,0 +1,290 @@ +use crate::entities::revision::{md5, RepeatedRevision, Revision}; +use crate::errors::{internal_error, CollaborateError, CollaborateResult}; +use crate::util::{cal_diff, make_delta_from_revisions}; +use bytes::Bytes; +use flowy_grid_data_model::entities::{ + FieldChangeset, FieldMeta, FieldOrder, GridBlockMeta, GridBlockMetaChangeset, GridMeta, RepeatedFieldOrder, +}; +use lib_infra::uuid; +use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder}; +use std::collections::HashMap; +use std::sync::Arc; + +pub type GridMetaDelta = PlainTextDelta; +pub type GridDeltaBuilder = PlainTextDeltaBuilder; + +pub struct GridMetaPad { + pub(crate) grid_meta: Arc, + pub(crate) delta: GridMetaDelta, +} + +impl GridMetaPad { + pub fn from_delta(delta: GridMetaDelta) -> CollaborateResult { + let s = delta.to_str()?; + let grid: GridMeta = serde_json::from_str(&s) + .map_err(|e| CollaborateError::internal().context(format!("Deserialize delta to grid failed: {}", e)))?; + + Ok(Self { + grid_meta: Arc::new(grid), + delta, + }) + } + + pub fn from_revisions(_grid_id: &str, revisions: Vec) -> CollaborateResult { + let grid_delta: GridMetaDelta = make_delta_from_revisions::(revisions)?; + Self::from_delta(grid_delta) + } + + pub fn create_field(&mut self, field_meta: FieldMeta) -> CollaborateResult> { + self.modify_grid(|grid| { + if grid.fields.contains(&field_meta) { + tracing::warn!("Duplicate grid field"); + Ok(None) + } else { + grid.fields.push(field_meta); + Ok(Some(())) + } + }) + } + + pub fn delete_field(&mut self, field_id: &str) -> CollaborateResult> { + self.modify_grid(|grid| match grid.fields.iter().position(|field| field.id == field_id) { + None => Ok(None), + Some(index) => { + grid.fields.remove(index); + Ok(Some(())) + } + }) + } + + pub fn contain_field(&self, field_id: &str) -> bool { + self.grid_meta.fields.iter().any(|field| field.id == field_id) + } + + pub fn get_field(&self, field_id: &str) -> Option<&FieldMeta> { + self.grid_meta.fields.iter().find(|field| field.id == field_id) + } + + pub fn get_field_orders(&self) -> Vec { + self.grid_meta.fields.iter().map(FieldOrder::from).collect() + } + + pub fn get_field_metas(&self, field_orders: Option) -> CollaborateResult> { + match field_orders { + None => Ok(self.grid_meta.fields.clone()), + Some(field_orders) => { + let field_by_field_id = self + .grid_meta + .fields + .iter() + .map(|field| (&field.id, field)) + .collect::>(); + + let fields = field_orders + .iter() + .flat_map(|field_order| match field_by_field_id.get(&field_order.field_id) { + None => { + tracing::error!("Can't find the field with id: {}", field_order.field_id); + None + } + Some(field) => Some((*field).clone()), + }) + .collect::>(); + Ok(fields) + } + } + } + + pub fn update_field(&mut self, changeset: FieldChangeset) -> CollaborateResult> { + let field_id = changeset.field_id.clone(); + self.modify_field(&field_id, |field| { + let mut is_changed = None; + if let Some(name) = changeset.name { + field.name = name; + is_changed = Some(()) + } + + if let Some(desc) = changeset.desc { + field.desc = desc; + is_changed = Some(()) + } + + if let Some(field_type) = changeset.field_type { + field.field_type = field_type; + is_changed = Some(()) + } + + if let Some(frozen) = changeset.frozen { + field.frozen = frozen; + is_changed = Some(()) + } + + if let Some(visibility) = changeset.visibility { + field.visibility = visibility; + is_changed = Some(()) + } + + if let Some(width) = changeset.width { + field.width = width; + is_changed = Some(()) + } + + if let Some(type_options) = changeset.type_options { + field.type_options = type_options; + is_changed = Some(()) + } + + Ok(is_changed) + }) + } + + pub fn create_block(&mut self, block: GridBlockMeta) -> CollaborateResult> { + self.modify_grid(|grid| { + if grid.block_metas.iter().any(|b| b.block_id == block.block_id) { + tracing::warn!("Duplicate grid block"); + Ok(None) + } else { + match grid.block_metas.last() { + None => grid.block_metas.push(block), + Some(last_block) => { + if last_block.start_row_index > block.start_row_index + && last_block.len() > block.start_row_index + { + let msg = "GridBlock's start_row_index should be greater than the last_block's start_row_index and its len".to_string(); + return Err(CollaborateError::internal().context(msg)) + } + grid.block_metas.push(block); + } + } + Ok(Some(())) + } + }) + } + + pub fn get_blocks(&self) -> Vec { + self.grid_meta.block_metas.clone() + } + + pub fn update_block(&mut self, changeset: GridBlockMetaChangeset) -> CollaborateResult> { + let block_id = changeset.block_id.clone(); + self.modify_block(&block_id, |block| { + let mut is_changed = None; + + if let Some(row_count) = changeset.row_count { + block.row_count = row_count; + is_changed = Some(()); + } + + if let Some(start_row_index) = changeset.start_row_index { + block.start_row_index = start_row_index; + is_changed = Some(()); + } + + Ok(is_changed) + }) + } + + pub fn md5(&self) -> String { + md5(&self.delta.to_delta_bytes()) + } + + pub fn delta_str(&self) -> String { + self.delta.to_delta_str() + } + + pub fn delta_bytes(&self) -> Bytes { + self.delta.to_delta_bytes() + } + + pub fn fields(&self) -> &[FieldMeta] { + &self.grid_meta.fields + } + + fn modify_grid(&mut self, f: F) -> CollaborateResult> + where + F: FnOnce(&mut GridMeta) -> CollaborateResult>, + { + let cloned_grid = self.grid_meta.clone(); + match f(Arc::make_mut(&mut self.grid_meta))? { + None => Ok(None), + Some(_) => { + let old = json_from_grid(&cloned_grid)?; + let new = json_from_grid(&self.grid_meta)?; + match cal_diff::(old, new) { + None => Ok(None), + Some(delta) => { + self.delta = self.delta.compose(&delta)?; + Ok(Some(GridChangeset { delta, md5: self.md5() })) + } + } + } + } + } + + pub fn modify_block(&mut self, block_id: &str, f: F) -> CollaborateResult> + where + F: FnOnce(&mut GridBlockMeta) -> CollaborateResult>, + { + self.modify_grid( + |grid| match grid.block_metas.iter().position(|block| block.block_id == block_id) { + None => { + tracing::warn!("[GridMetaPad]: Can't find any block with id: {}", block_id); + Ok(None) + } + Some(index) => f(&mut grid.block_metas[index]), + }, + ) + } + + pub fn modify_field(&mut self, field_id: &str, f: F) -> CollaborateResult> + where + F: FnOnce(&mut FieldMeta) -> CollaborateResult>, + { + self.modify_grid(|grid| match grid.fields.iter().position(|field| field.id == field_id) { + None => { + tracing::warn!("[GridMetaPad]: Can't find any field with id: {}", field_id); + Ok(None) + } + Some(index) => f(&mut grid.fields[index]), + }) + } +} + +fn json_from_grid(grid: &Arc) -> CollaborateResult { + let json = serde_json::to_string(grid) + .map_err(|err| internal_error(format!("Serialize grid to json str failed. {:?}", err)))?; + Ok(json) +} + +pub struct GridChangeset { + pub delta: GridMetaDelta, + /// md5: the md5 of the grid after applying the change. + pub md5: String, +} + +pub fn make_grid_delta(grid_meta: &GridMeta) -> GridMetaDelta { + let json = serde_json::to_string(&grid_meta).unwrap(); + PlainTextDeltaBuilder::new().insert(&json).build() +} + +pub fn make_grid_revisions(user_id: &str, grid_meta: &GridMeta) -> RepeatedRevision { + let delta = make_grid_delta(grid_meta); + let bytes = delta.to_delta_bytes(); + let revision = Revision::initial_revision(user_id, &grid_meta.grid_id, bytes); + revision.into() +} + +impl std::default::Default for GridMetaPad { + fn default() -> Self { + let grid = GridMeta { + grid_id: uuid(), + fields: vec![], + block_metas: vec![], + }; + let delta = make_grid_delta(&grid); + GridMetaPad { + grid_meta: Arc::new(grid), + delta, + } + } +} diff --git a/shared-lib/flowy-collaboration/src/client_grid/grid_pad.rs b/shared-lib/flowy-collaboration/src/client_grid/grid_pad.rs deleted file mode 100644 index 51be4dac63..0000000000 --- a/shared-lib/flowy-collaboration/src/client_grid/grid_pad.rs +++ /dev/null @@ -1,156 +0,0 @@ -use crate::entities::revision::{md5, RepeatedRevision, Revision}; -use crate::errors::{internal_error, CollaborateError, CollaborateResult}; -use crate::util::{cal_diff, make_delta_from_revisions}; -use flowy_grid_data_model::entities::{Field, FieldOrder, Grid, RawRow, RepeatedFieldOrder, RowOrder}; -use lib_infra::uuid; -use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder}; -use std::sync::Arc; - -pub type GridDelta = PlainTextDelta; -pub type GridDeltaBuilder = PlainTextDeltaBuilder; - -pub struct GridPad { - pub(crate) grid: Arc, - pub(crate) delta: GridDelta, -} - -impl GridPad { - pub fn from_delta(delta: GridDelta) -> CollaborateResult { - let s = delta.to_str()?; - let grid: Grid = serde_json::from_str(&s) - .map_err(|e| CollaborateError::internal().context(format!("Deserialize delta to grid failed: {}", e)))?; - - Ok(Self { - grid: Arc::new(grid), - delta, - }) - } - - pub fn from_revisions(_grid_id: &str, revisions: Vec) -> CollaborateResult { - let folder_delta: GridDelta = make_delta_from_revisions::(revisions)?; - Self::from_delta(folder_delta) - } - - pub fn create_row(&mut self, row: &RawRow) -> CollaborateResult> { - self.modify_grid(|grid| { - let row_order = RowOrder { - grid_id: grid.id.clone(), - row_id: row.id.clone(), - visibility: true, - }; - grid.row_orders.push(row_order); - Ok(Some(())) - }) - } - - pub fn create_field(&mut self, field: &Field) -> CollaborateResult> { - self.modify_grid(|grid| { - let field_order = FieldOrder { - field_id: field.id.clone(), - visibility: true, - }; - grid.field_orders.push(field_order); - Ok(Some(())) - }) - } - - pub fn delete_rows(&mut self, row_ids: &[String]) -> CollaborateResult> { - self.modify_grid(|grid| { - grid.row_orders.retain(|row_order| !row_ids.contains(&row_order.row_id)); - Ok(Some(())) - }) - } - - pub fn delete_field(&mut self, field_id: &str) -> CollaborateResult> { - self.modify_grid(|grid| { - match grid - .field_orders - .iter() - .position(|field_order| field_order.field_id == field_id) - { - None => Ok(None), - Some(index) => { - grid.field_orders.remove(index); - Ok(Some(())) - } - } - }) - } - - pub fn md5(&self) -> String { - md5(&self.delta.to_bytes()) - } - - pub fn grid_data(&self) -> Grid { - let grid_ref: &Grid = &self.grid; - grid_ref.clone() - } - - pub fn delta_str(&self) -> String { - self.delta.to_delta_str() - } - - pub fn field_orders(&self) -> &RepeatedFieldOrder { - &self.grid.field_orders - } - - pub fn modify_grid(&mut self, f: F) -> CollaborateResult> - where - F: FnOnce(&mut Grid) -> CollaborateResult>, - { - let cloned_grid = self.grid.clone(); - match f(Arc::make_mut(&mut self.grid))? { - None => Ok(None), - Some(_) => { - let old = json_from_grid(&cloned_grid)?; - let new = json_from_grid(&self.grid)?; - match cal_diff::(old, new) { - None => Ok(None), - Some(delta) => { - self.delta = self.delta.compose(&delta)?; - Ok(Some(GridChange { delta, md5: self.md5() })) - } - } - } - } - } -} - -fn json_from_grid(grid: &Arc) -> CollaborateResult { - let json = serde_json::to_string(grid) - .map_err(|err| internal_error(format!("Serialize grid to json str failed. {:?}", err)))?; - Ok(json) -} - -pub struct GridChange { - pub delta: GridDelta, - /// md5: the md5 of the grid after applying the change. - pub md5: String, -} - -pub fn make_grid_delta(grid: &Grid) -> GridDelta { - let json = serde_json::to_string(&grid).unwrap(); - PlainTextDeltaBuilder::new().insert(&json).build() -} - -pub fn make_grid_revisions(user_id: &str, grid: &Grid) -> RepeatedRevision { - let delta = make_grid_delta(grid); - let bytes = delta.to_bytes(); - let revision = Revision::initial_revision(user_id, &grid.id, bytes); - revision.into() -} - -impl std::default::Default for GridPad { - fn default() -> Self { - let grid = Grid { - id: uuid(), - field_orders: Default::default(), - row_orders: Default::default(), - }; - let delta = make_grid_delta(&grid); - GridPad { - grid: Arc::new(grid), - delta, - } - } -} diff --git a/shared-lib/flowy-collaboration/src/client_grid/mod.rs b/shared-lib/flowy-collaboration/src/client_grid/mod.rs index ee5a403a57..5df06e7858 100644 --- a/shared-lib/flowy-collaboration/src/client_grid/mod.rs +++ b/shared-lib/flowy-collaboration/src/client_grid/mod.rs @@ -1,3 +1,7 @@ -mod grid_pad; +mod grid_block_meta_pad; +mod grid_builder; +mod grid_meta_pad; -pub use grid_pad::*; +pub use grid_block_meta_pad::*; +pub use grid_builder::*; +pub use grid_meta_pad::*; diff --git a/shared-lib/flowy-collaboration/src/entities/mod.rs b/shared-lib/flowy-collaboration/src/entities/mod.rs index f31f9e34fd..8989125677 100644 --- a/shared-lib/flowy-collaboration/src/entities/mod.rs +++ b/shared-lib/flowy-collaboration/src/entities/mod.rs @@ -1,5 +1,5 @@ -pub mod document_info; pub mod folder_info; pub mod parser; pub mod revision; +pub mod text_block_info; pub mod ws_data; diff --git a/shared-lib/flowy-collaboration/src/entities/revision.rs b/shared-lib/flowy-collaboration/src/entities/revision.rs index cd99a194a1..57276bba1b 100644 --- a/shared-lib/flowy-collaboration/src/entities/revision.rs +++ b/shared-lib/flowy-collaboration/src/entities/revision.rs @@ -215,27 +215,6 @@ pub fn md5>(data: T) -> String { md5 } -#[derive(Debug, Clone, Eq, PartialEq)] -pub enum RevisionState { - Sync = 0, - Ack = 1, -} - -impl RevisionState { - pub fn is_need_sync(&self) -> bool { - match self { - RevisionState::Sync => true, - RevisionState::Ack => false, - } - } -} - -impl AsRef for RevisionState { - fn as_ref(&self) -> &RevisionState { - self - } -} - #[derive(Debug, ProtoBuf_Enum, Clone, Eq, PartialEq)] pub enum RevType { DeprecatedLocal = 0, diff --git a/shared-lib/flowy-collaboration/src/entities/document_info.rs b/shared-lib/flowy-collaboration/src/entities/text_block_info.rs similarity index 78% rename from shared-lib/flowy-collaboration/src/entities/document_info.rs rename to shared-lib/flowy-collaboration/src/entities/text_block_info.rs index f80ab97207..c325fdad07 100644 --- a/shared-lib/flowy-collaboration/src/entities/document_info.rs +++ b/shared-lib/flowy-collaboration/src/entities/text_block_info.rs @@ -6,7 +6,7 @@ use flowy_derive::ProtoBuf; use lib_ot::{errors::OTError, rich_text::RichTextDelta}; #[derive(ProtoBuf, Default, Debug, Clone)] -pub struct CreateBlockParams { +pub struct CreateTextBlockParams { #[pb(index = 1)] pub id: String, @@ -15,7 +15,7 @@ pub struct CreateBlockParams { } #[derive(ProtoBuf, Default, Debug, Clone, Eq, PartialEq)] -pub struct BlockInfo { +pub struct TextBlockInfo { #[pb(index = 1)] pub block_id: String, @@ -29,14 +29,14 @@ pub struct BlockInfo { pub base_rev_id: i64, } -impl BlockInfo { +impl TextBlockInfo { pub fn delta(&self) -> Result { let delta = RichTextDelta::from_bytes(&self.text)?; Ok(delta) } } -impl std::convert::TryFrom for BlockInfo { +impl std::convert::TryFrom for TextBlockInfo { type Error = CollaborateError; fn try_from(revision: Revision) -> Result { @@ -48,7 +48,7 @@ impl std::convert::TryFrom for BlockInfo { let delta = RichTextDelta::from_bytes(&revision.delta_data)?; let doc_json = delta.to_delta_str(); - Ok(BlockInfo { + Ok(TextBlockInfo { block_id: revision.object_id, text: doc_json, rev_id: revision.rev_id, @@ -58,7 +58,7 @@ impl std::convert::TryFrom for BlockInfo { } #[derive(ProtoBuf, Default, Debug, Clone)] -pub struct ResetBlockParams { +pub struct ResetTextBlockParams { #[pb(index = 1)] pub block_id: String, @@ -67,7 +67,7 @@ pub struct ResetBlockParams { } #[derive(ProtoBuf, Default, Debug, Clone)] -pub struct BlockDelta { +pub struct TextBlockDelta { #[pb(index = 1)] pub block_id: String, @@ -88,30 +88,30 @@ pub struct NewDocUser { } #[derive(ProtoBuf, Default, Debug, Clone)] -pub struct BlockId { +pub struct TextBlockId { #[pb(index = 1)] pub value: String, } -impl AsRef for BlockId { +impl AsRef for TextBlockId { fn as_ref(&self) -> &str { &self.value } } -impl std::convert::From for BlockId { +impl std::convert::From for TextBlockId { fn from(value: String) -> Self { - BlockId { value } + TextBlockId { value } } } -impl std::convert::From for String { - fn from(block_id: BlockId) -> Self { +impl std::convert::From for String { + fn from(block_id: TextBlockId) -> Self { block_id.value } } -impl std::convert::From<&String> for BlockId { +impl std::convert::From<&String> for TextBlockId { fn from(s: &String) -> Self { - BlockId { value: s.to_owned() } + TextBlockId { value: s.to_owned() } } } diff --git a/shared-lib/flowy-collaboration/src/protobuf/model/mod.rs b/shared-lib/flowy-collaboration/src/protobuf/model/mod.rs index 137466e63f..d0627984e3 100644 --- a/shared-lib/flowy-collaboration/src/protobuf/model/mod.rs +++ b/shared-lib/flowy-collaboration/src/protobuf/model/mod.rs @@ -7,8 +7,8 @@ pub use folder_info::*; mod ws_data; pub use ws_data::*; +mod text_block_info; +pub use text_block_info::*; + mod revision; pub use revision::*; - -mod document_info; -pub use document_info::*; diff --git a/shared-lib/flowy-collaboration/src/protobuf/model/revision.rs b/shared-lib/flowy-collaboration/src/protobuf/model/revision.rs index 079687ca44..02d1f522cf 100644 --- a/shared-lib/flowy-collaboration/src/protobuf/model/revision.rs +++ b/shared-lib/flowy-collaboration/src/protobuf/model/revision.rs @@ -914,56 +914,6 @@ impl ::protobuf::reflect::ProtobufValue for RevisionRange { } } -#[derive(Clone,PartialEq,Eq,Debug,Hash)] -pub enum RevisionState { - Sync = 0, - Ack = 1, -} - -impl ::protobuf::ProtobufEnum for RevisionState { - fn value(&self) -> i32 { - *self as i32 - } - - fn from_i32(value: i32) -> ::std::option::Option { - match value { - 0 => ::std::option::Option::Some(RevisionState::Sync), - 1 => ::std::option::Option::Some(RevisionState::Ack), - _ => ::std::option::Option::None - } - } - - fn values() -> &'static [Self] { - static values: &'static [RevisionState] = &[ - RevisionState::Sync, - RevisionState::Ack, - ]; - values - } - - fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - ::protobuf::reflect::EnumDescriptor::new_pb_name::("RevisionState", file_descriptor_proto()) - }) - } -} - -impl ::std::marker::Copy for RevisionState { -} - -impl ::std::default::Default for RevisionState { - fn default() -> Self { - RevisionState::Sync - } -} - -impl ::protobuf::reflect::ProtobufValue for RevisionState { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) - } -} - #[derive(Clone,PartialEq,Eq,Debug,Hash)] pub enum RevType { DeprecatedLocal = 0, @@ -1024,8 +974,7 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x10RepeatedRevision\x12\x1f\n\x05items\x18\x01\x20\x03(\x0b2\t.Revision\ R\x05items\"\x1d\n\x05RevId\x12\x14\n\x05value\x18\x01\x20\x01(\x03R\x05\ value\"7\n\rRevisionRange\x12\x14\n\x05start\x18\x01\x20\x01(\x03R\x05st\ - art\x12\x10\n\x03end\x18\x02\x20\x01(\x03R\x03end*\"\n\rRevisionState\ - \x12\x08\n\x04Sync\x10\0\x12\x07\n\x03Ack\x10\x01*4\n\x07RevType\x12\x13\ + art\x12\x10\n\x03end\x18\x02\x20\x01(\x03R\x03end*4\n\x07RevType\x12\x13\ \n\x0fDeprecatedLocal\x10\0\x12\x14\n\x10DeprecatedRemote\x10\x01b\x06pr\ oto3\ "; diff --git a/shared-lib/flowy-collaboration/src/protobuf/model/document_info.rs b/shared-lib/flowy-collaboration/src/protobuf/model/text_block_info.rs similarity index 85% rename from shared-lib/flowy-collaboration/src/protobuf/model/document_info.rs rename to shared-lib/flowy-collaboration/src/protobuf/model/text_block_info.rs index 28b3eb6bde..1e44767a92 100644 --- a/shared-lib/flowy-collaboration/src/protobuf/model/document_info.rs +++ b/shared-lib/flowy-collaboration/src/protobuf/model/text_block_info.rs @@ -17,14 +17,14 @@ #![allow(trivial_casts)] #![allow(unused_imports)] #![allow(unused_results)] -//! Generated file from `document_info.proto` +//! Generated file from `text_block_info.proto` /// Generated files are compatible only with the same version /// of protobuf runtime. // const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_25_2; #[derive(PartialEq,Clone,Default)] -pub struct CreateBlockParams { +pub struct CreateTextBlockParams { // message fields pub id: ::std::string::String, pub revisions: ::protobuf::SingularPtrField, @@ -33,14 +33,14 @@ pub struct CreateBlockParams { pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a CreateBlockParams { - fn default() -> &'a CreateBlockParams { - ::default_instance() +impl<'a> ::std::default::Default for &'a CreateTextBlockParams { + fn default() -> &'a CreateTextBlockParams { + ::default_instance() } } -impl CreateBlockParams { - pub fn new() -> CreateBlockParams { +impl CreateTextBlockParams { + pub fn new() -> CreateTextBlockParams { ::std::default::Default::default() } @@ -104,7 +104,7 @@ impl CreateBlockParams { } } -impl ::protobuf::Message for CreateBlockParams { +impl ::protobuf::Message for CreateTextBlockParams { fn is_initialized(&self) -> bool { for v in &self.revisions { if !v.is_initialized() { @@ -187,8 +187,8 @@ impl ::protobuf::Message for CreateBlockParams { Self::descriptor_static() } - fn new() -> CreateBlockParams { - CreateBlockParams::new() + fn new() -> CreateTextBlockParams { + CreateTextBlockParams::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -197,29 +197,29 @@ impl ::protobuf::Message for CreateBlockParams { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "id", - |m: &CreateBlockParams| { &m.id }, - |m: &mut CreateBlockParams| { &mut m.id }, + |m: &CreateTextBlockParams| { &m.id }, + |m: &mut CreateTextBlockParams| { &mut m.id }, )); fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( "revisions", - |m: &CreateBlockParams| { &m.revisions }, - |m: &mut CreateBlockParams| { &mut m.revisions }, + |m: &CreateTextBlockParams| { &m.revisions }, + |m: &mut CreateTextBlockParams| { &mut m.revisions }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "CreateBlockParams", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "CreateTextBlockParams", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static CreateBlockParams { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(CreateBlockParams::new) + fn default_instance() -> &'static CreateTextBlockParams { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(CreateTextBlockParams::new) } } -impl ::protobuf::Clear for CreateBlockParams { +impl ::protobuf::Clear for CreateTextBlockParams { fn clear(&mut self) { self.id.clear(); self.revisions.clear(); @@ -227,20 +227,20 @@ impl ::protobuf::Clear for CreateBlockParams { } } -impl ::std::fmt::Debug for CreateBlockParams { +impl ::std::fmt::Debug for CreateTextBlockParams { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for CreateBlockParams { +impl ::protobuf::reflect::ProtobufValue for CreateTextBlockParams { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } } #[derive(PartialEq,Clone,Default)] -pub struct BlockInfo { +pub struct TextBlockInfo { // message fields pub block_id: ::std::string::String, pub text: ::std::string::String, @@ -251,14 +251,14 @@ pub struct BlockInfo { pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a BlockInfo { - fn default() -> &'a BlockInfo { - ::default_instance() +impl<'a> ::std::default::Default for &'a TextBlockInfo { + fn default() -> &'a TextBlockInfo { + ::default_instance() } } -impl BlockInfo { - pub fn new() -> BlockInfo { +impl TextBlockInfo { + pub fn new() -> TextBlockInfo { ::std::default::Default::default() } @@ -345,7 +345,7 @@ impl BlockInfo { } } -impl ::protobuf::Message for BlockInfo { +impl ::protobuf::Message for TextBlockInfo { fn is_initialized(&self) -> bool { true } @@ -446,8 +446,8 @@ impl ::protobuf::Message for BlockInfo { Self::descriptor_static() } - fn new() -> BlockInfo { - BlockInfo::new() + fn new() -> TextBlockInfo { + TextBlockInfo::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -456,39 +456,39 @@ impl ::protobuf::Message for BlockInfo { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "block_id", - |m: &BlockInfo| { &m.block_id }, - |m: &mut BlockInfo| { &mut m.block_id }, + |m: &TextBlockInfo| { &m.block_id }, + |m: &mut TextBlockInfo| { &mut m.block_id }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "text", - |m: &BlockInfo| { &m.text }, - |m: &mut BlockInfo| { &mut m.text }, + |m: &TextBlockInfo| { &m.text }, + |m: &mut TextBlockInfo| { &mut m.text }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>( "rev_id", - |m: &BlockInfo| { &m.rev_id }, - |m: &mut BlockInfo| { &mut m.rev_id }, + |m: &TextBlockInfo| { &m.rev_id }, + |m: &mut TextBlockInfo| { &mut m.rev_id }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>( "base_rev_id", - |m: &BlockInfo| { &m.base_rev_id }, - |m: &mut BlockInfo| { &mut m.base_rev_id }, + |m: &TextBlockInfo| { &m.base_rev_id }, + |m: &mut TextBlockInfo| { &mut m.base_rev_id }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "BlockInfo", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "TextBlockInfo", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static BlockInfo { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(BlockInfo::new) + fn default_instance() -> &'static TextBlockInfo { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(TextBlockInfo::new) } } -impl ::protobuf::Clear for BlockInfo { +impl ::protobuf::Clear for TextBlockInfo { fn clear(&mut self) { self.block_id.clear(); self.text.clear(); @@ -498,20 +498,20 @@ impl ::protobuf::Clear for BlockInfo { } } -impl ::std::fmt::Debug for BlockInfo { +impl ::std::fmt::Debug for TextBlockInfo { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for BlockInfo { +impl ::protobuf::reflect::ProtobufValue for TextBlockInfo { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } } #[derive(PartialEq,Clone,Default)] -pub struct ResetBlockParams { +pub struct ResetTextBlockParams { // message fields pub block_id: ::std::string::String, pub revisions: ::protobuf::SingularPtrField, @@ -520,14 +520,14 @@ pub struct ResetBlockParams { pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a ResetBlockParams { - fn default() -> &'a ResetBlockParams { - ::default_instance() +impl<'a> ::std::default::Default for &'a ResetTextBlockParams { + fn default() -> &'a ResetTextBlockParams { + ::default_instance() } } -impl ResetBlockParams { - pub fn new() -> ResetBlockParams { +impl ResetTextBlockParams { + pub fn new() -> ResetTextBlockParams { ::std::default::Default::default() } @@ -591,7 +591,7 @@ impl ResetBlockParams { } } -impl ::protobuf::Message for ResetBlockParams { +impl ::protobuf::Message for ResetTextBlockParams { fn is_initialized(&self) -> bool { for v in &self.revisions { if !v.is_initialized() { @@ -674,8 +674,8 @@ impl ::protobuf::Message for ResetBlockParams { Self::descriptor_static() } - fn new() -> ResetBlockParams { - ResetBlockParams::new() + fn new() -> ResetTextBlockParams { + ResetTextBlockParams::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -684,29 +684,29 @@ impl ::protobuf::Message for ResetBlockParams { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "block_id", - |m: &ResetBlockParams| { &m.block_id }, - |m: &mut ResetBlockParams| { &mut m.block_id }, + |m: &ResetTextBlockParams| { &m.block_id }, + |m: &mut ResetTextBlockParams| { &mut m.block_id }, )); fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( "revisions", - |m: &ResetBlockParams| { &m.revisions }, - |m: &mut ResetBlockParams| { &mut m.revisions }, + |m: &ResetTextBlockParams| { &m.revisions }, + |m: &mut ResetTextBlockParams| { &mut m.revisions }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "ResetBlockParams", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "ResetTextBlockParams", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static ResetBlockParams { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(ResetBlockParams::new) + fn default_instance() -> &'static ResetTextBlockParams { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(ResetTextBlockParams::new) } } -impl ::protobuf::Clear for ResetBlockParams { +impl ::protobuf::Clear for ResetTextBlockParams { fn clear(&mut self) { self.block_id.clear(); self.revisions.clear(); @@ -714,20 +714,20 @@ impl ::protobuf::Clear for ResetBlockParams { } } -impl ::std::fmt::Debug for ResetBlockParams { +impl ::std::fmt::Debug for ResetTextBlockParams { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for ResetBlockParams { +impl ::protobuf::reflect::ProtobufValue for ResetTextBlockParams { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } } #[derive(PartialEq,Clone,Default)] -pub struct BlockDelta { +pub struct TextBlockDelta { // message fields pub block_id: ::std::string::String, pub delta_str: ::std::string::String, @@ -736,14 +736,14 @@ pub struct BlockDelta { pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a BlockDelta { - fn default() -> &'a BlockDelta { - ::default_instance() +impl<'a> ::std::default::Default for &'a TextBlockDelta { + fn default() -> &'a TextBlockDelta { + ::default_instance() } } -impl BlockDelta { - pub fn new() -> BlockDelta { +impl TextBlockDelta { + pub fn new() -> TextBlockDelta { ::std::default::Default::default() } @@ -800,7 +800,7 @@ impl BlockDelta { } } -impl ::protobuf::Message for BlockDelta { +impl ::protobuf::Message for TextBlockDelta { fn is_initialized(&self) -> bool { true } @@ -875,8 +875,8 @@ impl ::protobuf::Message for BlockDelta { Self::descriptor_static() } - fn new() -> BlockDelta { - BlockDelta::new() + fn new() -> TextBlockDelta { + TextBlockDelta::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -885,29 +885,29 @@ impl ::protobuf::Message for BlockDelta { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "block_id", - |m: &BlockDelta| { &m.block_id }, - |m: &mut BlockDelta| { &mut m.block_id }, + |m: &TextBlockDelta| { &m.block_id }, + |m: &mut TextBlockDelta| { &mut m.block_id }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "delta_str", - |m: &BlockDelta| { &m.delta_str }, - |m: &mut BlockDelta| { &mut m.delta_str }, + |m: &TextBlockDelta| { &m.delta_str }, + |m: &mut TextBlockDelta| { &mut m.delta_str }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "BlockDelta", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "TextBlockDelta", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static BlockDelta { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(BlockDelta::new) + fn default_instance() -> &'static TextBlockDelta { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(TextBlockDelta::new) } } -impl ::protobuf::Clear for BlockDelta { +impl ::protobuf::Clear for TextBlockDelta { fn clear(&mut self) { self.block_id.clear(); self.delta_str.clear(); @@ -915,13 +915,13 @@ impl ::protobuf::Clear for BlockDelta { } } -impl ::std::fmt::Debug for BlockDelta { +impl ::std::fmt::Debug for TextBlockDelta { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for BlockDelta { +impl ::protobuf::reflect::ProtobufValue for TextBlockDelta { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } @@ -1164,7 +1164,7 @@ impl ::protobuf::reflect::ProtobufValue for NewDocUser { } #[derive(PartialEq,Clone,Default)] -pub struct BlockId { +pub struct TextBlockId { // message fields pub value: ::std::string::String, // special fields @@ -1172,14 +1172,14 @@ pub struct BlockId { pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a BlockId { - fn default() -> &'a BlockId { - ::default_instance() +impl<'a> ::std::default::Default for &'a TextBlockId { + fn default() -> &'a TextBlockId { + ::default_instance() } } -impl BlockId { - pub fn new() -> BlockId { +impl TextBlockId { + pub fn new() -> TextBlockId { ::std::default::Default::default() } @@ -1210,7 +1210,7 @@ impl BlockId { } } -impl ::protobuf::Message for BlockId { +impl ::protobuf::Message for TextBlockId { fn is_initialized(&self) -> bool { true } @@ -1276,8 +1276,8 @@ impl ::protobuf::Message for BlockId { Self::descriptor_static() } - fn new() -> BlockId { - BlockId::new() + fn new() -> TextBlockId { + TextBlockId::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -1286,57 +1286,57 @@ impl ::protobuf::Message for BlockId { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "value", - |m: &BlockId| { &m.value }, - |m: &mut BlockId| { &mut m.value }, + |m: &TextBlockId| { &m.value }, + |m: &mut TextBlockId| { &mut m.value }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "BlockId", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "TextBlockId", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static BlockId { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(BlockId::new) + fn default_instance() -> &'static TextBlockId { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(TextBlockId::new) } } -impl ::protobuf::Clear for BlockId { +impl ::protobuf::Clear for TextBlockId { fn clear(&mut self) { self.value.clear(); self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for BlockId { +impl ::std::fmt::Debug for TextBlockId { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for BlockId { +impl ::protobuf::reflect::ProtobufValue for TextBlockId { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x13document_info.proto\x1a\x0erevision.proto\"T\n\x11CreateBlockParam\ - s\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12/\n\trevisions\x18\x02\ - \x20\x01(\x0b2\x11.RepeatedRevisionR\trevisions\"q\n\tBlockInfo\x12\x19\ - \n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12\x12\n\x04text\x18\x02\ - \x20\x01(\tR\x04text\x12\x15\n\x06rev_id\x18\x03\x20\x01(\x03R\x05revId\ - \x12\x1e\n\x0bbase_rev_id\x18\x04\x20\x01(\x03R\tbaseRevId\"^\n\x10Reset\ - BlockParams\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12/\n\ - \trevisions\x18\x02\x20\x01(\x0b2\x11.RepeatedRevisionR\trevisions\"D\n\ - \nBlockDelta\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12\ - \x1b\n\tdelta_str\x18\x02\x20\x01(\tR\x08deltaStr\"S\n\nNewDocUser\x12\ - \x17\n\x07user_id\x18\x01\x20\x01(\tR\x06userId\x12\x15\n\x06rev_id\x18\ - \x02\x20\x01(\x03R\x05revId\x12\x15\n\x06doc_id\x18\x03\x20\x01(\tR\x05d\ - ocId\"\x1f\n\x07BlockId\x12\x14\n\x05value\x18\x01\x20\x01(\tR\x05valueb\ - \x06proto3\ + \n\x15text_block_info.proto\x1a\x0erevision.proto\"X\n\x15CreateTextBloc\ + kParams\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12/\n\trevisions\x18\ + \x02\x20\x01(\x0b2\x11.RepeatedRevisionR\trevisions\"u\n\rTextBlockInfo\ + \x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12\x12\n\x04text\ + \x18\x02\x20\x01(\tR\x04text\x12\x15\n\x06rev_id\x18\x03\x20\x01(\x03R\ + \x05revId\x12\x1e\n\x0bbase_rev_id\x18\x04\x20\x01(\x03R\tbaseRevId\"b\n\ + \x14ResetTextBlockParams\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07bl\ + ockId\x12/\n\trevisions\x18\x02\x20\x01(\x0b2\x11.RepeatedRevisionR\trev\ + isions\"H\n\x0eTextBlockDelta\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\ + \x07blockId\x12\x1b\n\tdelta_str\x18\x02\x20\x01(\tR\x08deltaStr\"S\n\nN\ + ewDocUser\x12\x17\n\x07user_id\x18\x01\x20\x01(\tR\x06userId\x12\x15\n\ + \x06rev_id\x18\x02\x20\x01(\x03R\x05revId\x12\x15\n\x06doc_id\x18\x03\ + \x20\x01(\tR\x05docId\"#\n\x0bTextBlockId\x12\x14\n\x05value\x18\x01\x20\ + \x01(\tR\x05valueb\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/shared-lib/flowy-collaboration/src/protobuf/proto/revision.proto b/shared-lib/flowy-collaboration/src/protobuf/proto/revision.proto index 34c37409ab..5e899e9688 100644 --- a/shared-lib/flowy-collaboration/src/protobuf/proto/revision.proto +++ b/shared-lib/flowy-collaboration/src/protobuf/proto/revision.proto @@ -19,10 +19,6 @@ message RevisionRange { int64 start = 1; int64 end = 2; } -enum RevisionState { - Sync = 0; - Ack = 1; -} enum RevType { DeprecatedLocal = 0; DeprecatedRemote = 1; diff --git a/shared-lib/flowy-collaboration/src/protobuf/proto/document_info.proto b/shared-lib/flowy-collaboration/src/protobuf/proto/text_block_info.proto similarity index 76% rename from shared-lib/flowy-collaboration/src/protobuf/proto/document_info.proto rename to shared-lib/flowy-collaboration/src/protobuf/proto/text_block_info.proto index 9190b581a5..70717c4d2b 100644 --- a/shared-lib/flowy-collaboration/src/protobuf/proto/document_info.proto +++ b/shared-lib/flowy-collaboration/src/protobuf/proto/text_block_info.proto @@ -1,21 +1,21 @@ syntax = "proto3"; import "revision.proto"; -message CreateBlockParams { +message CreateTextBlockParams { string id = 1; RepeatedRevision revisions = 2; } -message BlockInfo { +message TextBlockInfo { string block_id = 1; string text = 2; int64 rev_id = 3; int64 base_rev_id = 4; } -message ResetBlockParams { +message ResetTextBlockParams { string block_id = 1; RepeatedRevision revisions = 2; } -message BlockDelta { +message TextBlockDelta { string block_id = 1; string delta_str = 2; } @@ -24,6 +24,6 @@ message NewDocUser { int64 rev_id = 2; string doc_id = 3; } -message BlockId { +message TextBlockId { string value = 1; } diff --git a/shared-lib/flowy-collaboration/src/server_document/document_manager.rs b/shared-lib/flowy-collaboration/src/server_document/document_manager.rs index 37c3bf4f6a..3232f0e9ca 100644 --- a/shared-lib/flowy-collaboration/src/server_document/document_manager.rs +++ b/shared-lib/flowy-collaboration/src/server_document/document_manager.rs @@ -1,5 +1,5 @@ use crate::{ - entities::{document_info::BlockInfo, ws_data::ServerRevisionWSDataBuilder}, + entities::{text_block_info::TextBlockInfo, ws_data::ServerRevisionWSDataBuilder}, errors::{internal_error, CollaborateError, CollaborateResult}, protobuf::{ClientRevisionWSData, RepeatedRevision as RepeatedRevisionPB, Revision as RevisionPB}, server_document::document_pad::ServerDocument, @@ -17,41 +17,42 @@ use tokio::{ task::spawn_blocking, }; -pub trait DocumentCloudPersistence: Send + Sync + Debug { - fn read_document(&self, doc_id: &str) -> BoxResultFuture; +pub trait TextBlockCloudPersistence: Send + Sync + Debug { + fn read_text_block(&self, doc_id: &str) -> BoxResultFuture; - fn create_document( + fn create_text_block( &self, doc_id: &str, repeated_revision: RepeatedRevisionPB, - ) -> BoxResultFuture, CollaborateError>; + ) -> BoxResultFuture, CollaborateError>; - fn read_document_revisions( + fn read_text_block_revisions( &self, doc_id: &str, rev_ids: Option>, ) -> BoxResultFuture, CollaborateError>; - fn save_document_revisions(&self, repeated_revision: RepeatedRevisionPB) -> BoxResultFuture<(), CollaborateError>; + fn save_text_block_revisions(&self, repeated_revision: RepeatedRevisionPB) + -> BoxResultFuture<(), CollaborateError>; - fn reset_document( + fn reset_text_block( &self, doc_id: &str, repeated_revision: RepeatedRevisionPB, ) -> BoxResultFuture<(), CollaborateError>; } -impl RevisionSyncPersistence for Arc { +impl RevisionSyncPersistence for Arc { fn read_revisions( &self, object_id: &str, rev_ids: Option>, ) -> BoxResultFuture, CollaborateError> { - (**self).read_document_revisions(object_id, rev_ids) + (**self).read_text_block_revisions(object_id, rev_ids) } fn save_revisions(&self, repeated_revision: RepeatedRevisionPB) -> BoxResultFuture<(), CollaborateError> { - (**self).save_document_revisions(repeated_revision) + (**self).save_text_block_revisions(repeated_revision) } fn reset_object( @@ -59,17 +60,17 @@ impl RevisionSyncPersistence for Arc { object_id: &str, repeated_revision: RepeatedRevisionPB, ) -> BoxResultFuture<(), CollaborateError> { - (**self).reset_document(object_id, repeated_revision) + (**self).reset_text_block(object_id, repeated_revision) } } pub struct ServerDocumentManager { document_handlers: Arc>>>, - persistence: Arc, + persistence: Arc, } impl ServerDocumentManager { - pub fn new(persistence: Arc) -> Self { + pub fn new(persistence: Arc) -> Self { Self { document_handlers: Arc::new(RwLock::new(HashMap::new())), persistence, @@ -151,7 +152,7 @@ impl ServerDocumentManager { } let mut write_guard = self.document_handlers.write().await; - match self.persistence.read_document(doc_id).await { + match self.persistence.read_text_block(doc_id).await { Ok(doc) => { let handler = self.create_document_handler(doc).await.map_err(internal_error).unwrap(); write_guard.insert(doc_id.to_owned(), handler.clone()); @@ -168,7 +169,7 @@ impl ServerDocumentManager { doc_id: &str, repeated_revision: RepeatedRevisionPB, ) -> Result, CollaborateError> { - match self.persistence.create_document(doc_id, repeated_revision).await? { + match self.persistence.create_text_block(doc_id, repeated_revision).await? { None => Err(CollaborateError::internal().context("Create document info from revisions failed")), Some(doc) => { let handler = self.create_document_handler(doc).await?; @@ -181,7 +182,7 @@ impl ServerDocumentManager { } } - async fn create_document_handler(&self, doc: BlockInfo) -> Result, CollaborateError> { + async fn create_document_handler(&self, doc: TextBlockInfo) -> Result, CollaborateError> { let persistence = self.persistence.clone(); let handle = spawn_blocking(|| OpenDocumentHandler::new(doc, persistence)) .await @@ -205,7 +206,7 @@ struct OpenDocumentHandler { } impl OpenDocumentHandler { - fn new(doc: BlockInfo, persistence: Arc) -> Result { + fn new(doc: TextBlockInfo, persistence: Arc) -> Result { let doc_id = doc.block_id.clone(); let (sender, receiver) = mpsc::channel(1000); let users = DashMap::new(); diff --git a/shared-lib/flowy-collaboration/src/util.rs b/shared-lib/flowy-collaboration/src/util.rs index 6953949961..a3ea7b136e 100644 --- a/shared-lib/flowy-collaboration/src/util.rs +++ b/shared-lib/flowy-collaboration/src/util.rs @@ -1,13 +1,13 @@ use crate::{ entities::{ - document_info::BlockInfo, folder_info::{FolderDelta, FolderInfo}, revision::{RepeatedRevision, Revision}, + text_block_info::TextBlockInfo, }, errors::{CollaborateError, CollaborateResult}, protobuf::{ - BlockInfo as BlockInfoPB, FolderInfo as FolderInfoPB, RepeatedRevision as RepeatedRevisionPB, - Revision as RevisionPB, + FolderInfo as FolderInfoPB, RepeatedRevision as RepeatedRevisionPB, Revision as RevisionPB, + TextBlockInfo as TextBlockInfoPB, }, }; use dissimilar::Chunk; @@ -202,11 +202,11 @@ pub fn make_folder_pb_from_revisions_pb( pub fn make_document_info_from_revisions_pb( doc_id: &str, revisions: RepeatedRevisionPB, -) -> Result, CollaborateError> { +) -> Result, CollaborateError> { match make_document_info_pb_from_revisions_pb(doc_id, revisions)? { None => Ok(None), Some(pb) => { - let document_info: BlockInfo = pb.try_into().map_err(|e| { + let document_info: TextBlockInfo = pb.try_into().map_err(|e| { CollaborateError::internal().context(format!("Deserialize document info from pb failed: {}", e)) })?; Ok(Some(document_info)) @@ -218,7 +218,7 @@ pub fn make_document_info_from_revisions_pb( pub fn make_document_info_pb_from_revisions_pb( doc_id: &str, mut revisions: RepeatedRevisionPB, -) -> Result, CollaborateError> { +) -> Result, CollaborateError> { let revisions = revisions.take_items(); if revisions.is_empty() { return Ok(None); @@ -240,7 +240,7 @@ pub fn make_document_info_pb_from_revisions_pb( } let text = document_delta.to_delta_str(); - let mut block_info = BlockInfoPB::new(); + let mut block_info = TextBlockInfoPB::new(); block_info.set_block_id(doc_id.to_owned()); block_info.set_text(text); block_info.set_base_rev_id(base_rev_id); diff --git a/shared-lib/flowy-derive/src/proto_buf/deserialize.rs b/shared-lib/flowy-derive/src/proto_buf/deserialize.rs index a971279b21..e09f7ea847 100644 --- a/shared-lib/flowy-derive/src/proto_buf/deserialize.rs +++ b/shared-lib/flowy-derive/src/proto_buf/deserialize.rs @@ -55,14 +55,11 @@ fn token_stream_for_one_of(ctxt: &Ctxt, field: &ASTField) -> Option } }?; let bracketed_ty_info = ty_info.bracket_ty_info.as_ref().as_ref(); - let has_func = format_ident!("has_{}", ident.to_string()); - // eprintln!("😁{:#?}", ty_info.primitive_ty); - // eprintln!("{:#?}", ty_info.bracket_ty_info); match ident_category(bracketed_ty_info.unwrap().ident) { TypeCategory::Enum => { let get_func = format_ident!("get_{}", ident.to_string()); - let ty = ty_info.ty; + let ty = bracketed_ty_info.unwrap().ty; Some(quote! { if pb.#has_func() { let enum_de_from_pb = #ty::try_from(&pb.#get_func()).unwrap(); diff --git a/shared-lib/flowy-derive/src/proto_buf/serialize.rs b/shared-lib/flowy-derive/src/proto_buf/serialize.rs index eff797a310..324c26651b 100644 --- a/shared-lib/flowy-derive/src/proto_buf/serialize.rs +++ b/shared-lib/flowy-derive/src/proto_buf/serialize.rs @@ -71,6 +71,12 @@ fn token_stream_for_one_of(ctxt: &Ctxt, field: &ASTField) -> Option None => {} } }), + TypeCategory::Enum => Some(quote! { + match self.#member { + Some(s) => { pb.#set_func(s.try_into().unwrap()) } + None => {} + } + }), _ => Some(quote! { match self.#member { Some(ref s) => { pb.#set_func(s.clone()) } diff --git a/shared-lib/flowy-derive/src/proto_buf/util.rs b/shared-lib/flowy-derive/src/proto_buf/util.rs index 49a5ee1605..ef9391fa0d 100644 --- a/shared-lib/flowy-derive/src/proto_buf/util.rs +++ b/shared-lib/flowy-derive/src/proto_buf/util.rs @@ -74,14 +74,14 @@ pub fn category_from_str(type_str: String) -> TypeCategory { } } - if let Some(protobuf) = CACHE_INFO.get(&TypeCategory::Protobuf) { - if protobuf.contains(&type_str) { + if let Some(protobuf_tys) = CACHE_INFO.get(&TypeCategory::Protobuf) { + if protobuf_tys.contains(&type_str) { return TypeCategory::Protobuf; } } - if let Some(protobuf) = CACHE_INFO.get(&TypeCategory::Enum) { - if protobuf.contains(&type_str) { + if let Some(enum_tys) = CACHE_INFO.get(&TypeCategory::Enum) { + if enum_tys.contains(&type_str) { return TypeCategory::Enum; } } diff --git a/shared-lib/flowy-error-code/src/code.rs b/shared-lib/flowy-error-code/src/code.rs index c47d4fd8d4..e184fd41bf 100644 --- a/shared-lib/flowy-error-code/src/code.rs +++ b/shared-lib/flowy-error-code/src/code.rs @@ -83,6 +83,16 @@ pub enum ErrorCode { UserIdInvalid = 311, #[display(fmt = "User not exist")] UserNotExist = 312, + #[display(fmt = "Text is too long")] + TextTooLong = 400, + #[display(fmt = "Grid block id is empty")] + BlockIdIsEmpty = 401, + #[display(fmt = "Row id is empty")] + RowIdIsEmpty = 402, + #[display(fmt = "Grid id is empty")] + GridIdIsEmpty = 403, + #[display(fmt = "Invalid data")] + InvalidData = 404, } impl ErrorCode { diff --git a/shared-lib/flowy-error-code/src/protobuf/model/code.rs b/shared-lib/flowy-error-code/src/protobuf/model/code.rs index f70c1eb49d..85a0721d7c 100644 --- a/shared-lib/flowy-error-code/src/protobuf/model/code.rs +++ b/shared-lib/flowy-error-code/src/protobuf/model/code.rs @@ -55,6 +55,11 @@ pub enum ErrorCode { UserNameIsEmpty = 310, UserIdInvalid = 311, UserNotExist = 312, + TextTooLong = 400, + BlockIdIsEmpty = 401, + RowIdIsEmpty = 402, + GridIdIsEmpty = 403, + InvalidData = 404, } impl ::protobuf::ProtobufEnum for ErrorCode { @@ -94,6 +99,11 @@ impl ::protobuf::ProtobufEnum for ErrorCode { 310 => ::std::option::Option::Some(ErrorCode::UserNameIsEmpty), 311 => ::std::option::Option::Some(ErrorCode::UserIdInvalid), 312 => ::std::option::Option::Some(ErrorCode::UserNotExist), + 400 => ::std::option::Option::Some(ErrorCode::TextTooLong), + 401 => ::std::option::Option::Some(ErrorCode::BlockIdIsEmpty), + 402 => ::std::option::Option::Some(ErrorCode::RowIdIsEmpty), + 403 => ::std::option::Option::Some(ErrorCode::GridIdIsEmpty), + 404 => ::std::option::Option::Some(ErrorCode::InvalidData), _ => ::std::option::Option::None } } @@ -130,6 +140,11 @@ impl ::protobuf::ProtobufEnum for ErrorCode { ErrorCode::UserNameIsEmpty, ErrorCode::UserIdInvalid, ErrorCode::UserNotExist, + ErrorCode::TextTooLong, + ErrorCode::BlockIdIsEmpty, + ErrorCode::RowIdIsEmpty, + ErrorCode::GridIdIsEmpty, + ErrorCode::InvalidData, ]; values } @@ -158,7 +173,7 @@ impl ::protobuf::reflect::ProtobufValue for ErrorCode { } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\ncode.proto*\xc4\x05\n\tErrorCode\x12\x0c\n\x08Internal\x10\0\x12\x14\ + \n\ncode.proto*\xa4\x06\n\tErrorCode\x12\x0c\n\x08Internal\x10\0\x12\x14\ \n\x10UserUnauthorized\x10\x02\x12\x12\n\x0eRecordNotFound\x10\x03\x12\ \x18\n\x14WorkspaceNameInvalid\x10d\x12\x16\n\x12WorkspaceIdInvalid\x10e\ \x12\x18\n\x14AppColorStyleInvalid\x10f\x12\x18\n\x14WorkspaceDescTooLon\ @@ -174,8 +189,10 @@ static file_descriptor_proto_data: &'static [u8] = b"\ rmatInvalid\x10\xb2\x02\x12\x15\n\x10PasswordNotMatch\x10\xb3\x02\x12\ \x14\n\x0fUserNameTooLong\x10\xb4\x02\x12'\n\"UserNameContainForbiddenCh\ aracters\x10\xb5\x02\x12\x14\n\x0fUserNameIsEmpty\x10\xb6\x02\x12\x12\n\ - \rUserIdInvalid\x10\xb7\x02\x12\x11\n\x0cUserNotExist\x10\xb8\x02b\x06pr\ - oto3\ + \rUserIdInvalid\x10\xb7\x02\x12\x11\n\x0cUserNotExist\x10\xb8\x02\x12\ + \x10\n\x0bTextTooLong\x10\x90\x03\x12\x13\n\x0eBlockIdIsEmpty\x10\x91\ + \x03\x12\x11\n\x0cRowIdIsEmpty\x10\x92\x03\x12\x12\n\rGridIdIsEmpty\x10\ + \x93\x03\x12\x10\n\x0bInvalidData\x10\x94\x03b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/shared-lib/flowy-error-code/src/protobuf/proto/code.proto b/shared-lib/flowy-error-code/src/protobuf/proto/code.proto index ed12d58848..7015c1fe38 100644 --- a/shared-lib/flowy-error-code/src/protobuf/proto/code.proto +++ b/shared-lib/flowy-error-code/src/protobuf/proto/code.proto @@ -31,4 +31,9 @@ enum ErrorCode { UserNameIsEmpty = 310; UserIdInvalid = 311; UserNotExist = 312; + TextTooLong = 400; + BlockIdIsEmpty = 401; + RowIdIsEmpty = 402; + GridIdIsEmpty = 403; + InvalidData = 404; } diff --git a/shared-lib/flowy-folder-data-model/src/entities/view.rs b/shared-lib/flowy-folder-data-model/src/entities/view.rs index 307850d396..3b98e3f64c 100644 --- a/shared-lib/flowy-folder-data-model/src/entities/view.rs +++ b/shared-lib/flowy-folder-data-model/src/entities/view.rs @@ -4,7 +4,7 @@ use crate::{ impl_def_and_def_mut, parser::{ app::AppIdentify, - view::{ViewDesc, ViewExtensionData, ViewIdentify, ViewName, ViewThumbnail}, + view::{ViewDesc, ViewIdentify, ViewName, ViewThumbnail}, }, }; use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; @@ -83,24 +83,24 @@ impl std::convert::From for Trash { #[derive(Eq, PartialEq, Hash, Debug, ProtoBuf_Enum, Clone, Serialize_repr, Deserialize_repr)] #[repr(u8)] pub enum ViewDataType { - Block = 0, + TextBlock = 0, Grid = 1, } impl std::default::Default for ViewDataType { fn default() -> Self { - ViewDataType::Block + ViewDataType::TextBlock } } impl std::convert::From for ViewDataType { fn from(val: i32) -> Self { match val { - 0 => ViewDataType::Block, + 0 => ViewDataType::TextBlock, 1 => ViewDataType::Grid, _ => { log::error!("Invalid view type: {}", val); - ViewDataType::Block + ViewDataType::TextBlock } } } @@ -124,10 +124,10 @@ pub struct CreateViewPayload { pub data_type: ViewDataType, #[pb(index = 6)] - pub ext_data: String, + pub plugin_type: i32, #[pb(index = 7)] - pub plugin_type: i32, + pub data: Vec, } #[derive(Default, ProtoBuf, Debug, Clone)] @@ -148,15 +148,12 @@ pub struct CreateViewParams { pub data_type: ViewDataType, #[pb(index = 6)] - pub ext_data: String, - - #[pb(index = 7)] pub view_id: String, - #[pb(index = 8)] - pub data: String, + #[pb(index = 7)] + pub data: Vec, - #[pb(index = 9)] + #[pb(index = 8)] pub plugin_type: i32, } @@ -167,12 +164,10 @@ impl TryInto for CreateViewPayload { let name = ViewName::parse(self.name)?.0; let belong_to_id = AppIdentify::parse(self.belong_to_id)?.0; let view_id = uuid::Uuid::new_v4().to_string(); - let ext_data = ViewExtensionData::parse(self.ext_data)?.0; let thumbnail = match self.thumbnail { None => "".to_string(), Some(thumbnail) => ViewThumbnail::parse(thumbnail)?.0, }; - let data = "".to_string(); Ok(CreateViewParams { belong_to_id, @@ -180,9 +175,8 @@ impl TryInto for CreateViewPayload { desc: self.desc, data_type: self.data_type, thumbnail, - ext_data, view_id, - data, + data: self.data, plugin_type: self.plugin_type, }) } diff --git a/shared-lib/flowy-folder-data-model/src/protobuf/model/view.rs b/shared-lib/flowy-folder-data-model/src/protobuf/model/view.rs index 26173acfaf..9f19e18f0c 100644 --- a/shared-lib/flowy-folder-data-model/src/protobuf/model/view.rs +++ b/shared-lib/flowy-folder-data-model/src/protobuf/model/view.rs @@ -165,7 +165,7 @@ impl View { self.data_type } pub fn clear_data_type(&mut self) { - self.data_type = ViewDataType::Block; + self.data_type = ViewDataType::TextBlock; } // Param is passed by value, moved @@ -409,7 +409,7 @@ impl ::protobuf::Message for View { if !self.desc.is_empty() { my_size += ::protobuf::rt::string_size(4, &self.desc); } - if self.data_type != ViewDataType::Block { + if self.data_type != ViewDataType::TextBlock { my_size += ::protobuf::rt::enum_size(5, self.data_type); } if self.version != 0 { @@ -452,7 +452,7 @@ impl ::protobuf::Message for View { if !self.desc.is_empty() { os.write_string(4, &self.desc)?; } - if self.data_type != ViewDataType::Block { + if self.data_type != ViewDataType::TextBlock { os.write_enum(5, ::protobuf::ProtobufEnum::value(&self.data_type))?; } if self.version != 0 { @@ -596,7 +596,7 @@ impl ::protobuf::Clear for View { self.belong_to_id.clear(); self.name.clear(); self.desc.clear(); - self.data_type = ViewDataType::Block; + self.data_type = ViewDataType::TextBlock; self.version = 0; self.belongings.clear(); self.modified_time = 0; @@ -793,8 +793,8 @@ pub struct CreateViewPayload { pub name: ::std::string::String, pub desc: ::std::string::String, pub data_type: ViewDataType, - pub ext_data: ::std::string::String, pub plugin_type: i32, + pub data: ::std::vec::Vec, // message oneof groups pub one_of_thumbnail: ::std::option::Option, // special fields @@ -952,7 +952,7 @@ impl CreateViewPayload { self.data_type } pub fn clear_data_type(&mut self) { - self.data_type = ViewDataType::Block; + self.data_type = ViewDataType::TextBlock; } // Param is passed by value, moved @@ -960,33 +960,7 @@ impl CreateViewPayload { self.data_type = v; } - // string ext_data = 6; - - - pub fn get_ext_data(&self) -> &str { - &self.ext_data - } - pub fn clear_ext_data(&mut self) { - self.ext_data.clear(); - } - - // Param is passed by value, moved - pub fn set_ext_data(&mut self, v: ::std::string::String) { - self.ext_data = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_ext_data(&mut self) -> &mut ::std::string::String { - &mut self.ext_data - } - - // Take field - pub fn take_ext_data(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.ext_data, ::std::string::String::new()) - } - - // int32 plugin_type = 7; + // int32 plugin_type = 6; pub fn get_plugin_type(&self) -> i32 { @@ -1000,6 +974,32 @@ impl CreateViewPayload { pub fn set_plugin_type(&mut self, v: i32) { self.plugin_type = v; } + + // bytes data = 7; + + + pub fn get_data(&self) -> &[u8] { + &self.data + } + pub fn clear_data(&mut self) { + self.data.clear(); + } + + // Param is passed by value, moved + pub fn set_data(&mut self, v: ::std::vec::Vec) { + self.data = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_data(&mut self) -> &mut ::std::vec::Vec { + &mut self.data + } + + // Take field + pub fn take_data(&mut self) -> ::std::vec::Vec { + ::std::mem::replace(&mut self.data, ::std::vec::Vec::new()) + } } impl ::protobuf::Message for CreateViewPayload { @@ -1030,15 +1030,15 @@ impl ::protobuf::Message for CreateViewPayload { ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.data_type, 5, &mut self.unknown_fields)? }, 6 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.ext_data)?; - }, - 7 => { if wire_type != ::protobuf::wire_format::WireTypeVarint { return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); } let tmp = is.read_int32()?; self.plugin_type = tmp; }, + 7 => { + ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.data)?; + }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; }, @@ -1060,14 +1060,14 @@ impl ::protobuf::Message for CreateViewPayload { if !self.desc.is_empty() { my_size += ::protobuf::rt::string_size(3, &self.desc); } - if self.data_type != ViewDataType::Block { + if self.data_type != ViewDataType::TextBlock { my_size += ::protobuf::rt::enum_size(5, self.data_type); } - if !self.ext_data.is_empty() { - my_size += ::protobuf::rt::string_size(6, &self.ext_data); - } if self.plugin_type != 0 { - my_size += ::protobuf::rt::value_size(7, self.plugin_type, ::protobuf::wire_format::WireTypeVarint); + my_size += ::protobuf::rt::value_size(6, self.plugin_type, ::protobuf::wire_format::WireTypeVarint); + } + if !self.data.is_empty() { + my_size += ::protobuf::rt::bytes_size(7, &self.data); } if let ::std::option::Option::Some(ref v) = self.one_of_thumbnail { match v { @@ -1091,14 +1091,14 @@ impl ::protobuf::Message for CreateViewPayload { if !self.desc.is_empty() { os.write_string(3, &self.desc)?; } - if self.data_type != ViewDataType::Block { + if self.data_type != ViewDataType::TextBlock { os.write_enum(5, ::protobuf::ProtobufEnum::value(&self.data_type))?; } - if !self.ext_data.is_empty() { - os.write_string(6, &self.ext_data)?; - } if self.plugin_type != 0 { - os.write_int32(7, self.plugin_type)?; + os.write_int32(6, self.plugin_type)?; + } + if !self.data.is_empty() { + os.write_bytes(7, &self.data)?; } if let ::std::option::Option::Some(ref v) = self.one_of_thumbnail { match v { @@ -1170,16 +1170,16 @@ impl ::protobuf::Message for CreateViewPayload { |m: &CreateViewPayload| { &m.data_type }, |m: &mut CreateViewPayload| { &mut m.data_type }, )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "ext_data", - |m: &CreateViewPayload| { &m.ext_data }, - |m: &mut CreateViewPayload| { &mut m.ext_data }, - )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>( "plugin_type", |m: &CreateViewPayload| { &m.plugin_type }, |m: &mut CreateViewPayload| { &mut m.plugin_type }, )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>( + "data", + |m: &CreateViewPayload| { &m.data }, + |m: &mut CreateViewPayload| { &mut m.data }, + )); ::protobuf::reflect::MessageDescriptor::new_pb_name::( "CreateViewPayload", fields, @@ -1200,9 +1200,9 @@ impl ::protobuf::Clear for CreateViewPayload { self.name.clear(); self.desc.clear(); self.one_of_thumbnail = ::std::option::Option::None; - self.data_type = ViewDataType::Block; - self.ext_data.clear(); + self.data_type = ViewDataType::TextBlock; self.plugin_type = 0; + self.data.clear(); self.unknown_fields.clear(); } } @@ -1227,9 +1227,8 @@ pub struct CreateViewParams { pub desc: ::std::string::String, pub thumbnail: ::std::string::String, pub data_type: ViewDataType, - pub ext_data: ::std::string::String, pub view_id: ::std::string::String, - pub data: ::std::string::String, + pub data: ::std::vec::Vec, pub plugin_type: i32, // special fields pub unknown_fields: ::protobuf::UnknownFields, @@ -1358,7 +1357,7 @@ impl CreateViewParams { self.data_type } pub fn clear_data_type(&mut self) { - self.data_type = ViewDataType::Block; + self.data_type = ViewDataType::TextBlock; } // Param is passed by value, moved @@ -1366,33 +1365,7 @@ impl CreateViewParams { self.data_type = v; } - // string ext_data = 6; - - - pub fn get_ext_data(&self) -> &str { - &self.ext_data - } - pub fn clear_ext_data(&mut self) { - self.ext_data.clear(); - } - - // Param is passed by value, moved - pub fn set_ext_data(&mut self, v: ::std::string::String) { - self.ext_data = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_ext_data(&mut self) -> &mut ::std::string::String { - &mut self.ext_data - } - - // Take field - pub fn take_ext_data(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.ext_data, ::std::string::String::new()) - } - - // string view_id = 7; + // string view_id = 6; pub fn get_view_id(&self) -> &str { @@ -1418,10 +1391,10 @@ impl CreateViewParams { ::std::mem::replace(&mut self.view_id, ::std::string::String::new()) } - // string data = 8; + // bytes data = 7; - pub fn get_data(&self) -> &str { + pub fn get_data(&self) -> &[u8] { &self.data } pub fn clear_data(&mut self) { @@ -1429,22 +1402,22 @@ impl CreateViewParams { } // Param is passed by value, moved - pub fn set_data(&mut self, v: ::std::string::String) { + pub fn set_data(&mut self, v: ::std::vec::Vec) { self.data = v; } // Mutable pointer to the field. // If field is not initialized, it is initialized with default value first. - pub fn mut_data(&mut self) -> &mut ::std::string::String { + pub fn mut_data(&mut self) -> &mut ::std::vec::Vec { &mut self.data } // Take field - pub fn take_data(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.data, ::std::string::String::new()) + pub fn take_data(&mut self) -> ::std::vec::Vec { + ::std::mem::replace(&mut self.data, ::std::vec::Vec::new()) } - // int32 plugin_type = 9; + // int32 plugin_type = 8; pub fn get_plugin_type(&self) -> i32 { @@ -1485,15 +1458,12 @@ impl ::protobuf::Message for CreateViewParams { ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.data_type, 5, &mut self.unknown_fields)? }, 6 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.ext_data)?; - }, - 7 => { ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.view_id)?; }, - 8 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.data)?; + 7 => { + ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.data)?; }, - 9 => { + 8 => { if wire_type != ::protobuf::wire_format::WireTypeVarint { return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); } @@ -1524,20 +1494,17 @@ impl ::protobuf::Message for CreateViewParams { if !self.thumbnail.is_empty() { my_size += ::protobuf::rt::string_size(4, &self.thumbnail); } - if self.data_type != ViewDataType::Block { + if self.data_type != ViewDataType::TextBlock { my_size += ::protobuf::rt::enum_size(5, self.data_type); } - if !self.ext_data.is_empty() { - my_size += ::protobuf::rt::string_size(6, &self.ext_data); - } if !self.view_id.is_empty() { - my_size += ::protobuf::rt::string_size(7, &self.view_id); + my_size += ::protobuf::rt::string_size(6, &self.view_id); } if !self.data.is_empty() { - my_size += ::protobuf::rt::string_size(8, &self.data); + my_size += ::protobuf::rt::bytes_size(7, &self.data); } if self.plugin_type != 0 { - my_size += ::protobuf::rt::value_size(9, self.plugin_type, ::protobuf::wire_format::WireTypeVarint); + my_size += ::protobuf::rt::value_size(8, self.plugin_type, ::protobuf::wire_format::WireTypeVarint); } my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); @@ -1557,20 +1524,17 @@ impl ::protobuf::Message for CreateViewParams { if !self.thumbnail.is_empty() { os.write_string(4, &self.thumbnail)?; } - if self.data_type != ViewDataType::Block { + if self.data_type != ViewDataType::TextBlock { os.write_enum(5, ::protobuf::ProtobufEnum::value(&self.data_type))?; } - if !self.ext_data.is_empty() { - os.write_string(6, &self.ext_data)?; - } if !self.view_id.is_empty() { - os.write_string(7, &self.view_id)?; + os.write_string(6, &self.view_id)?; } if !self.data.is_empty() { - os.write_string(8, &self.data)?; + os.write_bytes(7, &self.data)?; } if self.plugin_type != 0 { - os.write_int32(9, self.plugin_type)?; + os.write_int32(8, self.plugin_type)?; } os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) @@ -1635,17 +1599,12 @@ impl ::protobuf::Message for CreateViewParams { |m: &CreateViewParams| { &m.data_type }, |m: &mut CreateViewParams| { &mut m.data_type }, )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "ext_data", - |m: &CreateViewParams| { &m.ext_data }, - |m: &mut CreateViewParams| { &mut m.ext_data }, - )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "view_id", |m: &CreateViewParams| { &m.view_id }, |m: &mut CreateViewParams| { &mut m.view_id }, )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>( "data", |m: &CreateViewParams| { &m.data }, |m: &mut CreateViewParams| { &mut m.data }, @@ -1675,8 +1634,7 @@ impl ::protobuf::Clear for CreateViewParams { self.name.clear(); self.desc.clear(); self.thumbnail.clear(); - self.data_type = ViewDataType::Block; - self.ext_data.clear(); + self.data_type = ViewDataType::TextBlock; self.view_id.clear(); self.data.clear(); self.plugin_type = 0; @@ -2821,7 +2779,7 @@ impl ::protobuf::reflect::ProtobufValue for UpdateViewParams { #[derive(Clone,PartialEq,Eq,Debug,Hash)] pub enum ViewDataType { - Block = 0, + TextBlock = 0, Grid = 1, } @@ -2832,7 +2790,7 @@ impl ::protobuf::ProtobufEnum for ViewDataType { fn from_i32(value: i32) -> ::std::option::Option { match value { - 0 => ::std::option::Option::Some(ViewDataType::Block), + 0 => ::std::option::Option::Some(ViewDataType::TextBlock), 1 => ::std::option::Option::Some(ViewDataType::Grid), _ => ::std::option::Option::None } @@ -2840,7 +2798,7 @@ impl ::protobuf::ProtobufEnum for ViewDataType { fn values() -> &'static [Self] { static values: &'static [ViewDataType] = &[ - ViewDataType::Block, + ViewDataType::TextBlock, ViewDataType::Grid, ]; values @@ -2859,7 +2817,7 @@ impl ::std::marker::Copy for ViewDataType { impl ::std::default::Default for ViewDataType { fn default() -> Self { - ViewDataType::Block + ViewDataType::TextBlock } } @@ -2880,32 +2838,32 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x18\t\x20\x01(\x03R\ncreateTime\x12\x19\n\x08ext_data\x18\n\x20\x01(\tR\ \x07extData\x12\x1c\n\tthumbnail\x18\x0b\x20\x01(\tR\tthumbnail\x12\x1f\ \n\x0bplugin_type\x18\x0c\x20\x01(\x05R\npluginType\"+\n\x0cRepeatedView\ - \x12\x1b\n\x05items\x18\x01\x20\x03(\x0b2\x05.ViewR\x05items\"\xf9\x01\n\ + \x12\x1b\n\x05items\x18\x01\x20\x03(\x0b2\x05.ViewR\x05items\"\xf2\x01\n\ \x11CreateViewPayload\x12\x20\n\x0cbelong_to_id\x18\x01\x20\x01(\tR\nbel\ ongToId\x12\x12\n\x04name\x18\x02\x20\x01(\tR\x04name\x12\x12\n\x04desc\ \x18\x03\x20\x01(\tR\x04desc\x12\x1e\n\tthumbnail\x18\x04\x20\x01(\tH\0R\ \tthumbnail\x12*\n\tdata_type\x18\x05\x20\x01(\x0e2\r.ViewDataTypeR\x08d\ - ataType\x12\x19\n\x08ext_data\x18\x06\x20\x01(\tR\x07extData\x12\x1f\n\ - \x0bplugin_type\x18\x07\x20\x01(\x05R\npluginTypeB\x12\n\x10one_of_thumb\ - nail\"\x8f\x02\n\x10CreateViewParams\x12\x20\n\x0cbelong_to_id\x18\x01\ - \x20\x01(\tR\nbelongToId\x12\x12\n\x04name\x18\x02\x20\x01(\tR\x04name\ - \x12\x12\n\x04desc\x18\x03\x20\x01(\tR\x04desc\x12\x1c\n\tthumbnail\x18\ - \x04\x20\x01(\tR\tthumbnail\x12*\n\tdata_type\x18\x05\x20\x01(\x0e2\r.Vi\ - ewDataTypeR\x08dataType\x12\x19\n\x08ext_data\x18\x06\x20\x01(\tR\x07ext\ - Data\x12\x17\n\x07view_id\x18\x07\x20\x01(\tR\x06viewId\x12\x12\n\x04dat\ - a\x18\x08\x20\x01(\tR\x04data\x12\x1f\n\x0bplugin_type\x18\t\x20\x01(\ - \x05R\npluginType\"\x1e\n\x06ViewId\x12\x14\n\x05value\x18\x01\x20\x01(\ - \tR\x05value\"&\n\x0eRepeatedViewId\x12\x14\n\x05items\x18\x01\x20\x03(\ - \tR\x05items\"\xaa\x01\n\x11UpdateViewPayload\x12\x17\n\x07view_id\x18\ - \x01\x20\x01(\tR\x06viewId\x12\x14\n\x04name\x18\x02\x20\x01(\tH\0R\x04n\ - ame\x12\x14\n\x04desc\x18\x03\x20\x01(\tH\x01R\x04desc\x12\x1e\n\tthumbn\ - ail\x18\x04\x20\x01(\tH\x02R\tthumbnailB\r\n\x0bone_of_nameB\r\n\x0bone_\ - of_descB\x12\n\x10one_of_thumbnail\"\xa9\x01\n\x10UpdateViewParams\x12\ - \x17\n\x07view_id\x18\x01\x20\x01(\tR\x06viewId\x12\x14\n\x04name\x18\ - \x02\x20\x01(\tH\0R\x04name\x12\x14\n\x04desc\x18\x03\x20\x01(\tH\x01R\ - \x04desc\x12\x1e\n\tthumbnail\x18\x04\x20\x01(\tH\x02R\tthumbnailB\r\n\ - \x0bone_of_nameB\r\n\x0bone_of_descB\x12\n\x10one_of_thumbnail*#\n\x0cVi\ - ewDataType\x12\t\n\x05Block\x10\0\x12\x08\n\x04Grid\x10\x01b\x06proto3\ + ataType\x12\x1f\n\x0bplugin_type\x18\x06\x20\x01(\x05R\npluginType\x12\ + \x12\n\x04data\x18\x07\x20\x01(\x0cR\x04dataB\x12\n\x10one_of_thumbnail\ + \"\xf4\x01\n\x10CreateViewParams\x12\x20\n\x0cbelong_to_id\x18\x01\x20\ + \x01(\tR\nbelongToId\x12\x12\n\x04name\x18\x02\x20\x01(\tR\x04name\x12\ + \x12\n\x04desc\x18\x03\x20\x01(\tR\x04desc\x12\x1c\n\tthumbnail\x18\x04\ + \x20\x01(\tR\tthumbnail\x12*\n\tdata_type\x18\x05\x20\x01(\x0e2\r.ViewDa\ + taTypeR\x08dataType\x12\x17\n\x07view_id\x18\x06\x20\x01(\tR\x06viewId\ + \x12\x12\n\x04data\x18\x07\x20\x01(\x0cR\x04data\x12\x1f\n\x0bplugin_typ\ + e\x18\x08\x20\x01(\x05R\npluginType\"\x1e\n\x06ViewId\x12\x14\n\x05value\ + \x18\x01\x20\x01(\tR\x05value\"&\n\x0eRepeatedViewId\x12\x14\n\x05items\ + \x18\x01\x20\x03(\tR\x05items\"\xaa\x01\n\x11UpdateViewPayload\x12\x17\n\ + \x07view_id\x18\x01\x20\x01(\tR\x06viewId\x12\x14\n\x04name\x18\x02\x20\ + \x01(\tH\0R\x04name\x12\x14\n\x04desc\x18\x03\x20\x01(\tH\x01R\x04desc\ + \x12\x1e\n\tthumbnail\x18\x04\x20\x01(\tH\x02R\tthumbnailB\r\n\x0bone_of\ + _nameB\r\n\x0bone_of_descB\x12\n\x10one_of_thumbnail\"\xa9\x01\n\x10Upda\ + teViewParams\x12\x17\n\x07view_id\x18\x01\x20\x01(\tR\x06viewId\x12\x14\ + \n\x04name\x18\x02\x20\x01(\tH\0R\x04name\x12\x14\n\x04desc\x18\x03\x20\ + \x01(\tH\x01R\x04desc\x12\x1e\n\tthumbnail\x18\x04\x20\x01(\tH\x02R\tthu\ + mbnailB\r\n\x0bone_of_nameB\r\n\x0bone_of_descB\x12\n\x10one_of_thumbnai\ + l*'\n\x0cViewDataType\x12\r\n\tTextBlock\x10\0\x12\x08\n\x04Grid\x10\x01\ + b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/shared-lib/flowy-folder-data-model/src/protobuf/proto/view.proto b/shared-lib/flowy-folder-data-model/src/protobuf/proto/view.proto index 2a471bc53f..56e09c54e4 100644 --- a/shared-lib/flowy-folder-data-model/src/protobuf/proto/view.proto +++ b/shared-lib/flowy-folder-data-model/src/protobuf/proto/view.proto @@ -23,8 +23,8 @@ message CreateViewPayload { string desc = 3; oneof one_of_thumbnail { string thumbnail = 4; }; ViewDataType data_type = 5; - string ext_data = 6; - int32 plugin_type = 7; + int32 plugin_type = 6; + bytes data = 7; } message CreateViewParams { string belong_to_id = 1; @@ -32,10 +32,9 @@ message CreateViewParams { string desc = 3; string thumbnail = 4; ViewDataType data_type = 5; - string ext_data = 6; - string view_id = 7; - string data = 8; - int32 plugin_type = 9; + string view_id = 6; + bytes data = 7; + int32 plugin_type = 8; } message ViewId { string value = 1; @@ -56,6 +55,6 @@ message UpdateViewParams { oneof one_of_thumbnail { string thumbnail = 4; }; } enum ViewDataType { - Block = 0; + TextBlock = 0; Grid = 1; } diff --git a/shared-lib/flowy-folder-data-model/src/user_default.rs b/shared-lib/flowy-folder-data-model/src/user_default.rs index 198953a61f..ff3161d89b 100644 --- a/shared-lib/flowy-folder-data-model/src/user_default.rs +++ b/shared-lib/flowy-folder-data-model/src/user_default.rs @@ -49,7 +49,7 @@ fn create_default_view(app_id: String, time: chrono::DateTime) -> View { let view_id = uuid::Uuid::new_v4(); let name = "Read me".to_string(); let desc = "".to_string(); - let data_type = ViewDataType::Block; + let data_type = ViewDataType::TextBlock; View { id: view_id.to_string(), diff --git a/shared-lib/flowy-grid-data-model/Cargo.toml b/shared-lib/flowy-grid-data-model/Cargo.toml index c0e5bb91bc..89461b444c 100644 --- a/shared-lib/flowy-grid-data-model/Cargo.toml +++ b/shared-lib/flowy-grid-data-model/Cargo.toml @@ -14,6 +14,7 @@ strum_macros = "0.21" serde = { version = "1.0", features = ["derive"] } serde_json = {version = "1.0"} uuid = { version = "0.8", features = ["serde", "v4"] } +flowy-error-code = { path = "../flowy-error-code"} [build-dependencies] lib-infra = { path = "../lib-infra", features = ["protobuf_file_gen"] } diff --git a/shared-lib/flowy-grid-data-model/src/entities/grid.rs b/shared-lib/flowy-grid-data-model/src/entities/grid.rs index 926ca1e750..c195a85c24 100644 --- a/shared-lib/flowy-grid-data-model/src/entities/grid.rs +++ b/shared-lib/flowy-grid-data-model/src/entities/grid.rs @@ -1,69 +1,18 @@ -use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; -use serde::{Deserialize, Serialize}; +use crate::entities::{FieldMeta, FieldType, RowMeta}; +use flowy_derive::ProtoBuf; use std::collections::HashMap; -use strum_macros::{Display, EnumIter, EnumString}; +use std::sync::Arc; -pub trait GridIdentifiable { - fn id(&self) -> &str; -} - -#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize, ProtoBuf)] +#[derive(Debug, Clone, Default, ProtoBuf)] pub struct Grid { #[pb(index = 1)] pub id: String, #[pb(index = 2)] - #[serde(flatten)] - pub field_orders: RepeatedFieldOrder, + pub field_orders: Vec, #[pb(index = 3)] - #[serde(flatten)] - pub row_orders: RepeatedRowOrder, -} - -#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, ProtoBuf)] -pub struct FieldOrder { - #[pb(index = 1)] - pub field_id: String, - - #[pb(index = 2)] - pub visibility: bool, -} - -impl std::convert::From<&Field> for FieldOrder { - fn from(field: &Field) -> Self { - Self { - field_id: field.id.clone(), - visibility: true, - } - } -} - -#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize, ProtoBuf)] -pub struct RepeatedFieldOrder { - #[pb(index = 1)] - #[serde(rename(serialize = "field_orders", deserialize = "field_orders"))] - pub items: Vec, -} - -impl std::convert::From> for RepeatedFieldOrder { - fn from(items: Vec) -> Self { - Self { items } - } -} - -impl std::ops::Deref for RepeatedFieldOrder { - type Target = Vec; - - fn deref(&self) -> &Self::Target { - &self.items - } -} - -impl std::ops::DerefMut for RepeatedFieldOrder { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.items - } + pub block_orders: Vec, } #[derive(Debug, Clone, Default, ProtoBuf)] @@ -84,15 +33,37 @@ pub struct Field { pub frozen: bool, #[pb(index = 6)] - pub width: i32, + pub visibility: bool, #[pb(index = 7)] - pub type_options: AnyData, + pub width: i32, } -impl GridIdentifiable for Field { - fn id(&self) -> &str { - &self.id +#[derive(Debug, Clone, Default, ProtoBuf)] +pub struct FieldOrder { + #[pb(index = 1)] + pub field_id: String, +} + +impl std::convert::From<&FieldMeta> for FieldOrder { + fn from(field_meta: &FieldMeta) -> Self { + Self { + field_id: field_meta.id.clone(), + } + } +} + +impl std::convert::From for Field { + fn from(field_meta: FieldMeta) -> Self { + Self { + id: field_meta.id, + name: field_meta.name, + desc: field_meta.desc, + field_type: field_meta.field_type, + frozen: field_meta.frozen, + visibility: field_meta.visibility, + width: field_meta.width, + } } } @@ -120,176 +91,48 @@ impl std::convert::From> for RepeatedField { } } -#[derive(Debug, Clone, PartialEq, Eq, ProtoBuf_Enum, EnumString, EnumIter, Display, Serialize, Deserialize)] -pub enum FieldType { - RichText = 0, - Number = 1, - DateTime = 2, - SingleSelect = 3, - MultiSelect = 4, - Checkbox = 5, -} - -impl std::default::Default for FieldType { - fn default() -> Self { - FieldType::RichText - } -} - -impl FieldType { - #[allow(dead_code)] - pub fn type_id(&self) -> String { - let ty = self.clone(); - format!("{}", ty as u8) - } - - pub fn from_type_id(type_id: &str) -> Result { - match type_id { - "0" => Ok(FieldType::RichText), - "1" => Ok(FieldType::Number), - "2" => Ok(FieldType::DateTime), - "3" => Ok(FieldType::SingleSelect), - "4" => Ok(FieldType::MultiSelect), - "5" => Ok(FieldType::Checkbox), - _ => Err(format!("Invalid type_id: {}", type_id)), - } - } -} - #[derive(Debug, Clone, Default, ProtoBuf)] -pub struct AnyData { +pub struct RepeatedFieldOrder { #[pb(index = 1)] - pub type_id: String, - - #[pb(index = 2)] - pub value: Vec, + pub items: Vec, } -impl AnyData { - pub fn from_str(field_type: &FieldType, s: &str) -> AnyData { - Self::from_bytes(field_type, s.as_bytes().to_vec()) - } - - pub fn from_bytes>(field_type: &FieldType, bytes: T) -> AnyData { - AnyData { - type_id: field_type.type_id(), - value: bytes.as_ref().to_vec(), - } +impl std::ops::Deref for RepeatedFieldOrder { + type Target = Vec; + fn deref(&self) -> &Self::Target { + &self.items } } -impl ToString for AnyData { - fn to_string(&self) -> String { - match String::from_utf8(self.value.clone()) { - Ok(s) => s, - Err(_) => "".to_owned(), - } - } -} - -#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize, ProtoBuf)] +#[derive(Debug, Default, Clone, ProtoBuf)] pub struct RowOrder { #[pb(index = 1)] - pub grid_id: String, - - #[pb(index = 2)] pub row_id: String, + #[pb(index = 2)] + pub block_id: String, + #[pb(index = 3)] - pub visibility: bool, + pub height: i32, } -impl std::convert::From<&RawRow> for RowOrder { - fn from(row: &RawRow) -> Self { +impl std::convert::From<&RowMeta> for RowOrder { + fn from(row: &RowMeta) -> Self { Self { - grid_id: row.grid_id.clone(), row_id: row.id.clone(), - visibility: true, + block_id: row.block_id.clone(), + height: row.height, } } } -#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, ProtoBuf)] -pub struct RepeatedRowOrder { - #[pb(index = 1)] - #[serde(rename(serialize = "row_orders", deserialize = "row_orders"))] - pub items: Vec, -} - -impl std::convert::From> for RepeatedRowOrder { - fn from(items: Vec) -> Self { - Self { items } - } -} - -impl std::ops::Deref for RepeatedRowOrder { - type Target = Vec; - fn deref(&self) -> &Self::Target { - &self.items - } -} - -impl std::ops::DerefMut for RepeatedRowOrder { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.items - } -} - -#[derive(Debug, Default, ProtoBuf)] -pub struct RawRow { - #[pb(index = 1)] - pub id: String, - - #[pb(index = 2)] - pub grid_id: String, - - #[pb(index = 3)] - pub cell_by_field_id: HashMap, -} - -impl GridIdentifiable for RawRow { - fn id(&self) -> &str { - &self.id - } -} - -#[derive(Debug, Default, ProtoBuf)] -pub struct RawCell { - #[pb(index = 1)] - pub id: String, - - #[pb(index = 2)] - pub row_id: String, - - #[pb(index = 3)] - pub field_id: String, - - #[pb(index = 4)] - pub data: AnyData, -} - -#[derive(Debug, Default, ProtoBuf)] -pub struct RepeatedRow { - #[pb(index = 1)] - pub items: Vec, -} - -impl std::ops::Deref for RepeatedRow { - type Target = Vec; - fn deref(&self) -> &Self::Target { - &self.items - } -} - -impl std::ops::DerefMut for RepeatedRow { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.items - } -} - -impl std::convert::From> for RepeatedRow { - fn from(items: Vec) -> Self { - Self { items } +impl std::convert::From<&Arc> for RowOrder { + fn from(row: &Arc) -> Self { + Self { + row_id: row.id.clone(), + block_id: row.block_id.clone(), + height: row.height, + } } } @@ -300,13 +143,55 @@ pub struct Row { #[pb(index = 2)] pub cell_by_field_id: HashMap, + + #[pb(index = 3)] + pub height: i32, } -impl Row { - pub fn new(row_id: &str) -> Self { +#[derive(Debug, Default, ProtoBuf)] +pub struct RepeatedRow { + #[pb(index = 1)] + pub items: Vec, +} + +impl std::convert::From> for RepeatedRow { + fn from(items: Vec) -> Self { + Self { items } + } +} + +#[derive(Debug, Default, ProtoBuf)] +pub struct RepeatedGridBlock { + #[pb(index = 1)] + pub items: Vec, +} + +impl std::convert::From> for RepeatedGridBlock { + fn from(items: Vec) -> Self { + Self { items } + } +} + +#[derive(Debug, Clone, Default, ProtoBuf)] +pub struct GridBlockOrder { + #[pb(index = 1)] + pub block_id: String, +} + +#[derive(Debug, Default, ProtoBuf)] +pub struct GridBlock { + #[pb(index = 1)] + pub block_id: String, + + #[pb(index = 2)] + pub row_orders: Vec, +} + +impl GridBlock { + pub fn new(block_id: &str, row_orders: Vec) -> Self { Self { - id: row_id.to_owned(), - cell_by_field_id: HashMap::new(), + block_id: block_id.to_owned(), + row_orders, } } } @@ -314,28 +199,44 @@ impl Row { #[derive(Debug, Default, ProtoBuf)] pub struct Cell { #[pb(index = 1)] - pub id: String, - - #[pb(index = 2)] pub field_id: String, - #[pb(index = 3)] + #[pb(index = 2)] pub content: String, } +impl Cell { + pub fn new(field_id: &str, content: String) -> Self { + Self { + field_id: field_id.to_owned(), + content, + } + } +} + #[derive(Debug, Default, ProtoBuf)] -pub struct CellChangeset { +pub struct RepeatedCell { #[pb(index = 1)] - pub id: String, + pub items: Vec, +} - #[pb(index = 2)] - pub row_id: String, +impl std::ops::Deref for RepeatedCell { + type Target = Vec; + fn deref(&self) -> &Self::Target { + &self.items + } +} - #[pb(index = 3)] - pub field_id: String, +impl std::ops::DerefMut for RepeatedCell { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.items + } +} - #[pb(index = 4)] - pub data: String, +impl std::convert::From> for RepeatedCell { + fn from(items: Vec) -> Self { + Self { items } + } } #[derive(ProtoBuf, Default)] @@ -356,6 +257,27 @@ impl AsRef for GridId { } } +#[derive(Clone, ProtoBuf, Default, Debug)] +pub struct GridBlockId { + #[pb(index = 1)] + pub value: String, +} + +impl AsRef for GridBlockId { + fn as_ref(&self) -> &str { + &self.value + } +} + +#[derive(ProtoBuf, Default)] +pub struct CreateRowPayload { + #[pb(index = 1)] + pub grid_id: String, + + #[pb(index = 2, one_of)] + pub start_row_id: Option, +} + #[derive(ProtoBuf, Default)] pub struct QueryFieldPayload { #[pb(index = 1)] @@ -365,11 +287,23 @@ pub struct QueryFieldPayload { pub field_orders: RepeatedFieldOrder, } +#[derive(ProtoBuf, Default)] +pub struct QueryGridBlocksPayload { + #[pb(index = 1)] + pub grid_id: String, + + #[pb(index = 2)] + pub block_orders: Vec, +} + #[derive(ProtoBuf, Default)] pub struct QueryRowPayload { #[pb(index = 1)] pub grid_id: String, #[pb(index = 2)] - pub row_orders: RepeatedRowOrder, + pub block_id: String, + + #[pb(index = 3)] + pub row_id: String, } diff --git a/shared-lib/flowy-grid-data-model/src/entities/meta.rs b/shared-lib/flowy-grid-data-model/src/entities/meta.rs new file mode 100644 index 0000000000..9ba374169c --- /dev/null +++ b/shared-lib/flowy-grid-data-model/src/entities/meta.rs @@ -0,0 +1,351 @@ +use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use strum_macros::{Display, EnumCount as EnumCountMacro, EnumIter, EnumString}; + +pub const DEFAULT_ROW_HEIGHT: i32 = 36; +pub const DEFAULT_FIELD_WIDTH: i32 = 150; + +#[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf)] +pub struct GridMeta { + #[pb(index = 1)] + pub grid_id: String, + + #[pb(index = 2)] + pub fields: Vec, + + #[pb(index = 3)] + pub block_metas: Vec, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, ProtoBuf)] +pub struct GridBlockMeta { + #[pb(index = 1)] + pub block_id: String, + + #[pb(index = 2)] + pub start_row_index: i32, + + #[pb(index = 3)] + pub row_count: i32, +} + +impl GridBlockMeta { + pub fn len(&self) -> i32 { + self.row_count + } + + pub fn is_empty(&self) -> bool { + self.row_count == 0 + } +} + +impl GridBlockMeta { + pub fn new() -> Self { + GridBlockMeta { + block_id: uuid::Uuid::new_v4().to_string(), + ..Default::default() + } + } +} + +pub struct GridBlockMetaChangeset { + pub block_id: String, + pub start_row_index: Option, + pub row_count: Option, +} + +impl GridBlockMetaChangeset { + pub fn from_row_count(block_id: &str, row_count: i32) -> Self { + Self { + block_id: block_id.to_string(), + start_row_index: None, + row_count: Some(row_count), + } + } +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf)] +pub struct GridBlockMetaSerde { + #[pb(index = 1)] + pub block_id: String, + + #[pb(index = 2)] + pub row_metas: Vec, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf, PartialEq, Eq)] +pub struct FieldMeta { + #[pb(index = 1)] + pub id: String, + + #[pb(index = 2)] + pub name: String, + + #[pb(index = 3)] + pub desc: String, + + #[pb(index = 4)] + pub field_type: FieldType, + + #[pb(index = 5)] + pub frozen: bool, + + #[pb(index = 6)] + pub visibility: bool, + + #[pb(index = 7)] + pub width: i32, + + #[pb(index = 8)] + pub type_options: String, +} + +impl FieldMeta { + pub fn new(name: &str, desc: &str, field_type: FieldType) -> Self { + Self { + id: uuid::Uuid::new_v4().to_string(), + name: name.to_string(), + desc: desc.to_string(), + field_type, + frozen: false, + visibility: true, + width: DEFAULT_FIELD_WIDTH, + type_options: Default::default(), + } + } +} + +#[derive(Debug, Clone, Default, ProtoBuf)] +pub struct FieldChangeset { + #[pb(index = 1)] + pub field_id: String, + + #[pb(index = 2, one_of)] + pub name: Option, + + #[pb(index = 3, one_of)] + pub desc: Option, + + #[pb(index = 4, one_of)] + pub field_type: Option, + + #[pb(index = 5, one_of)] + pub frozen: Option, + + #[pb(index = 6, one_of)] + pub visibility: Option, + + #[pb(index = 7, one_of)] + pub width: Option, + + #[pb(index = 8, one_of)] + pub type_options: Option, +} + +#[derive( + Debug, Clone, PartialEq, Eq, ProtoBuf_Enum, EnumCountMacro, EnumString, EnumIter, Display, Serialize, Deserialize, +)] +pub enum FieldType { + RichText = 0, + Number = 1, + DateTime = 2, + SingleSelect = 3, + MultiSelect = 4, + Checkbox = 5, +} + +impl std::default::Default for FieldType { + fn default() -> Self { + FieldType::RichText + } +} + +impl AsRef for FieldType { + fn as_ref(&self) -> &FieldType { + self + } +} + +impl From<&FieldType> for FieldType { + fn from(field_type: &FieldType) -> Self { + field_type.clone() + } +} + +impl FieldType { + pub fn type_id(&self) -> String { + let ty = self.clone(); + format!("{}", ty as u8) + } + + pub fn from_type_id(type_id: &str) -> Result { + match type_id { + "0" => Ok(FieldType::RichText), + "1" => Ok(FieldType::Number), + "2" => Ok(FieldType::DateTime), + "3" => Ok(FieldType::SingleSelect), + "4" => Ok(FieldType::MultiSelect), + "5" => Ok(FieldType::Checkbox), + _ => Err(format!("Invalid type_id: {}", type_id)), + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default, ProtoBuf)] +pub struct AnyData { + #[pb(index = 1)] + pub type_id: String, + + #[pb(index = 2)] + pub value: Vec, +} + +impl AnyData { + pub fn from_str>(field_type: F, s: &str) -> AnyData { + Self::from_bytes(field_type, s.as_bytes().to_vec()) + } + + pub fn from_bytes, F: Into>(field_type: F, bytes: T) -> AnyData { + AnyData { + type_id: field_type.into().type_id(), + value: bytes.as_ref().to_vec(), + } + } +} + +impl ToString for AnyData { + fn to_string(&self) -> String { + match String::from_utf8(self.value.clone()) { + Ok(s) => s, + Err(_) => "".to_owned(), + } + } +} + +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, ProtoBuf)] +pub struct RowMeta { + #[pb(index = 1)] + pub id: String, + + #[pb(index = 2)] + pub block_id: String, + + #[pb(index = 3)] + pub cell_by_field_id: HashMap, + + #[pb(index = 4)] + pub height: i32, + + #[pb(index = 5)] + pub visibility: bool, +} + +impl RowMeta { + pub fn new(block_id: &str) -> Self { + Self { + id: uuid::Uuid::new_v4().to_string(), + block_id: block_id.to_owned(), + cell_by_field_id: Default::default(), + height: DEFAULT_ROW_HEIGHT, + visibility: true, + } + } +} + +#[derive(Debug, Clone, Default, ProtoBuf)] +pub struct RowMetaChangeset { + #[pb(index = 1)] + pub row_id: String, + + #[pb(index = 2, one_of)] + pub height: Option, + + #[pb(index = 3, one_of)] + pub visibility: Option, + + #[pb(index = 4)] + pub cell_by_field_id: HashMap, +} + +#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize, ProtoBuf)] +pub struct CellMeta { + #[pb(index = 1)] + pub field_id: String, + + #[pb(index = 2)] + pub data: String, +} + +impl CellMeta { + pub fn new(field_id: &str, data: String) -> Self { + Self { + field_id: field_id.to_string(), + data, + } + } +} + +#[derive(Debug, Clone, Default, ProtoBuf)] +pub struct CellMetaChangeset { + #[pb(index = 1)] + pub grid_id: String, + + #[pb(index = 2)] + pub row_id: String, + + #[pb(index = 3)] + pub field_id: String, + + #[pb(index = 4, one_of)] + pub data: Option, +} + +impl std::convert::From for RowMetaChangeset { + fn from(changeset: CellMetaChangeset) -> Self { + let mut cell_by_field_id = HashMap::with_capacity(1); + if let Some(data) = changeset.data { + let field_id = changeset.field_id; + let cell_meta = CellMeta { + field_id: field_id.clone(), + data, + }; + cell_by_field_id.insert(field_id, cell_meta); + } + + RowMetaChangeset { + row_id: changeset.row_id, + height: None, + visibility: None, + cell_by_field_id, + } + } +} + +#[derive(Clone, ProtoBuf)] +pub struct BuildGridContext { + #[pb(index = 1)] + pub field_metas: Vec, + + #[pb(index = 2)] + pub block_metas: GridBlockMeta, + + #[pb(index = 3)] + pub block_meta_data: GridBlockMetaSerde, +} + +impl std::default::Default for BuildGridContext { + fn default() -> Self { + let grid_block = GridBlockMeta::new(); + let grid_block_meta_data = GridBlockMetaSerde { + block_id: grid_block.block_id.clone(), + row_metas: vec![], + }; + + Self { + field_metas: vec![], + block_metas: grid_block, + block_meta_data: grid_block_meta_data, + } + } +} diff --git a/shared-lib/flowy-grid-data-model/src/entities/mod.rs b/shared-lib/flowy-grid-data-model/src/entities/mod.rs index 9ba72a1272..350f8092d5 100644 --- a/shared-lib/flowy-grid-data-model/src/entities/mod.rs +++ b/shared-lib/flowy-grid-data-model/src/entities/mod.rs @@ -1,3 +1,5 @@ mod grid; +mod meta; pub use grid::*; +pub use meta::*; diff --git a/shared-lib/flowy-grid-data-model/src/lib.rs b/shared-lib/flowy-grid-data-model/src/lib.rs index 85976edd74..bd9ed4465e 100644 --- a/shared-lib/flowy-grid-data-model/src/lib.rs +++ b/shared-lib/flowy-grid-data-model/src/lib.rs @@ -1,2 +1,3 @@ pub mod entities; +pub mod parser; pub mod protobuf; diff --git a/shared-lib/flowy-grid-data-model/src/parser/grid.rs b/shared-lib/flowy-grid-data-model/src/parser/grid.rs new file mode 100644 index 0000000000..49a202cf70 --- /dev/null +++ b/shared-lib/flowy-grid-data-model/src/parser/grid.rs @@ -0,0 +1,82 @@ +use crate::entities::{ + CreateRowPayload, GridBlockOrder, QueryFieldPayload, QueryGridBlocksPayload, QueryRowPayload, RepeatedFieldOrder, +}; +use crate::parser::NonEmptyId; +use flowy_error_code::ErrorCode; + +#[derive(Default)] +pub struct CreateRowParams { + pub grid_id: String, + pub start_row_id: Option, +} + +impl TryInto for CreateRowPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let grid_id = NonEmptyId::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; + Ok(CreateRowParams { + grid_id: grid_id.0, + start_row_id: self.start_row_id, + }) + } +} + +#[derive(Default)] +pub struct QueryFieldParams { + pub grid_id: String, + pub field_orders: RepeatedFieldOrder, +} + +impl TryInto for QueryFieldPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let grid_id = NonEmptyId::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; + Ok(QueryFieldParams { + grid_id: grid_id.0, + field_orders: self.field_orders, + }) + } +} + +#[derive(Default)] +pub struct QueryGridBlocksParams { + pub grid_id: String, + pub block_orders: Vec, +} + +impl TryInto for QueryGridBlocksPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let grid_id = NonEmptyId::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; + Ok(QueryGridBlocksParams { + grid_id: grid_id.0, + block_orders: self.block_orders, + }) + } +} + +#[derive(Default)] +pub struct QueryRowParams { + pub grid_id: String, + pub block_id: String, + pub row_id: String, +} + +impl TryInto for QueryRowPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let grid_id = NonEmptyId::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; + let block_id = NonEmptyId::parse(self.block_id).map_err(|_| ErrorCode::BlockIdIsEmpty)?; + let row_id = NonEmptyId::parse(self.row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?; + + Ok(QueryRowParams { + grid_id: grid_id.0, + block_id: block_id.0, + row_id: row_id.0, + }) + } +} diff --git a/shared-lib/flowy-grid-data-model/src/parser/id.rs b/shared-lib/flowy-grid-data-model/src/parser/id.rs new file mode 100644 index 0000000000..5dbe65cf04 --- /dev/null +++ b/shared-lib/flowy-grid-data-model/src/parser/id.rs @@ -0,0 +1,18 @@ +#[derive(Debug)] +pub struct NonEmptyId(pub String); + +impl NonEmptyId { + pub fn parse(s: String) -> Result { + if s.trim().is_empty() { + return Err(()); + } + + Ok(Self(s)) + } +} + +impl AsRef for NonEmptyId { + fn as_ref(&self) -> &str { + &self.0 + } +} diff --git a/shared-lib/flowy-grid-data-model/src/parser/mod.rs b/shared-lib/flowy-grid-data-model/src/parser/mod.rs new file mode 100644 index 0000000000..ec81801043 --- /dev/null +++ b/shared-lib/flowy-grid-data-model/src/parser/mod.rs @@ -0,0 +1,5 @@ +mod grid; +mod id; + +pub use grid::*; +pub use id::*; diff --git a/shared-lib/flowy-grid-data-model/src/protobuf/model/grid.rs b/shared-lib/flowy-grid-data-model/src/protobuf/model/grid.rs index f64dde24e6..fc538875c9 100644 --- a/shared-lib/flowy-grid-data-model/src/protobuf/model/grid.rs +++ b/shared-lib/flowy-grid-data-model/src/protobuf/model/grid.rs @@ -27,8 +27,8 @@ pub struct Grid { // message fields pub id: ::std::string::String, - pub field_orders: ::protobuf::SingularPtrField, - pub row_orders: ::protobuf::SingularPtrField, + pub field_orders: ::protobuf::RepeatedField, + pub block_orders: ::protobuf::RepeatedField, // special fields pub unknown_fields: ::protobuf::UnknownFields, pub cached_size: ::protobuf::CachedSize, @@ -71,70 +71,54 @@ impl Grid { ::std::mem::replace(&mut self.id, ::std::string::String::new()) } - // .RepeatedFieldOrder field_orders = 2; + // repeated .FieldOrder field_orders = 2; - pub fn get_field_orders(&self) -> &RepeatedFieldOrder { - self.field_orders.as_ref().unwrap_or_else(|| ::default_instance()) + pub fn get_field_orders(&self) -> &[FieldOrder] { + &self.field_orders } pub fn clear_field_orders(&mut self) { self.field_orders.clear(); } - pub fn has_field_orders(&self) -> bool { - self.field_orders.is_some() - } - // Param is passed by value, moved - pub fn set_field_orders(&mut self, v: RepeatedFieldOrder) { - self.field_orders = ::protobuf::SingularPtrField::some(v); + pub fn set_field_orders(&mut self, v: ::protobuf::RepeatedField) { + self.field_orders = v; } // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_field_orders(&mut self) -> &mut RepeatedFieldOrder { - if self.field_orders.is_none() { - self.field_orders.set_default(); - } - self.field_orders.as_mut().unwrap() + pub fn mut_field_orders(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.field_orders } // Take field - pub fn take_field_orders(&mut self) -> RepeatedFieldOrder { - self.field_orders.take().unwrap_or_else(|| RepeatedFieldOrder::new()) + pub fn take_field_orders(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.field_orders, ::protobuf::RepeatedField::new()) } - // .RepeatedRowOrder row_orders = 3; + // repeated .GridBlockOrder block_orders = 3; - pub fn get_row_orders(&self) -> &RepeatedRowOrder { - self.row_orders.as_ref().unwrap_or_else(|| ::default_instance()) + pub fn get_block_orders(&self) -> &[GridBlockOrder] { + &self.block_orders } - pub fn clear_row_orders(&mut self) { - self.row_orders.clear(); - } - - pub fn has_row_orders(&self) -> bool { - self.row_orders.is_some() + pub fn clear_block_orders(&mut self) { + self.block_orders.clear(); } // Param is passed by value, moved - pub fn set_row_orders(&mut self, v: RepeatedRowOrder) { - self.row_orders = ::protobuf::SingularPtrField::some(v); + pub fn set_block_orders(&mut self, v: ::protobuf::RepeatedField) { + self.block_orders = v; } // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_row_orders(&mut self) -> &mut RepeatedRowOrder { - if self.row_orders.is_none() { - self.row_orders.set_default(); - } - self.row_orders.as_mut().unwrap() + pub fn mut_block_orders(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.block_orders } // Take field - pub fn take_row_orders(&mut self) -> RepeatedRowOrder { - self.row_orders.take().unwrap_or_else(|| RepeatedRowOrder::new()) + pub fn take_block_orders(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.block_orders, ::protobuf::RepeatedField::new()) } } @@ -145,7 +129,7 @@ impl ::protobuf::Message for Grid { return false; } }; - for v in &self.row_orders { + for v in &self.block_orders { if !v.is_initialized() { return false; } @@ -161,10 +145,10 @@ impl ::protobuf::Message for Grid { ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; }, 2 => { - ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.field_orders)?; + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.field_orders)?; }, 3 => { - ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.row_orders)?; + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.block_orders)?; }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; @@ -181,14 +165,14 @@ impl ::protobuf::Message for Grid { if !self.id.is_empty() { my_size += ::protobuf::rt::string_size(1, &self.id); } - if let Some(ref v) = self.field_orders.as_ref() { - let len = v.compute_size(); + for value in &self.field_orders { + let len = value.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; - } - if let Some(ref v) = self.row_orders.as_ref() { - let len = v.compute_size(); + }; + for value in &self.block_orders { + let len = value.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; - } + }; my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); my_size @@ -198,16 +182,16 @@ impl ::protobuf::Message for Grid { if !self.id.is_empty() { os.write_string(1, &self.id)?; } - if let Some(ref v) = self.field_orders.as_ref() { + for v in &self.field_orders { os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; os.write_raw_varint32(v.get_cached_size())?; v.write_to_with_cached_sizes(os)?; - } - if let Some(ref v) = self.row_orders.as_ref() { + }; + for v in &self.block_orders { os.write_tag(3, ::protobuf::wire_format::WireTypeLengthDelimited)?; os.write_raw_varint32(v.get_cached_size())?; v.write_to_with_cached_sizes(os)?; - } + }; os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) } @@ -251,15 +235,15 @@ impl ::protobuf::Message for Grid { |m: &Grid| { &m.id }, |m: &mut Grid| { &mut m.id }, )); - fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( "field_orders", |m: &Grid| { &m.field_orders }, |m: &mut Grid| { &mut m.field_orders }, )); - fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( - "row_orders", - |m: &Grid| { &m.row_orders }, - |m: &mut Grid| { &mut m.row_orders }, + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "block_orders", + |m: &Grid| { &m.block_orders }, + |m: &mut Grid| { &mut m.block_orders }, )); ::protobuf::reflect::MessageDescriptor::new_pb_name::( "Grid", @@ -279,7 +263,7 @@ impl ::protobuf::Clear for Grid { fn clear(&mut self) { self.id.clear(); self.field_orders.clear(); - self.row_orders.clear(); + self.block_orders.clear(); self.unknown_fields.clear(); } } @@ -296,376 +280,16 @@ impl ::protobuf::reflect::ProtobufValue for Grid { } } -#[derive(PartialEq,Clone,Default)] -pub struct FieldOrder { - // message fields - pub field_id: ::std::string::String, - pub visibility: bool, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a FieldOrder { - fn default() -> &'a FieldOrder { - ::default_instance() - } -} - -impl FieldOrder { - pub fn new() -> FieldOrder { - ::std::default::Default::default() - } - - // string field_id = 1; - - - pub fn get_field_id(&self) -> &str { - &self.field_id - } - pub fn clear_field_id(&mut self) { - self.field_id.clear(); - } - - // Param is passed by value, moved - pub fn set_field_id(&mut self, v: ::std::string::String) { - self.field_id = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_field_id(&mut self) -> &mut ::std::string::String { - &mut self.field_id - } - - // Take field - pub fn take_field_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.field_id, ::std::string::String::new()) - } - - // bool visibility = 2; - - - pub fn get_visibility(&self) -> bool { - self.visibility - } - pub fn clear_visibility(&mut self) { - self.visibility = false; - } - - // Param is passed by value, moved - pub fn set_visibility(&mut self, v: bool) { - self.visibility = v; - } -} - -impl ::protobuf::Message for FieldOrder { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?; - }, - 2 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_bool()?; - self.visibility = tmp; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if !self.field_id.is_empty() { - my_size += ::protobuf::rt::string_size(1, &self.field_id); - } - if self.visibility != false { - my_size += 2; - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if !self.field_id.is_empty() { - os.write_string(1, &self.field_id)?; - } - if self.visibility != false { - os.write_bool(2, self.visibility)?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> FieldOrder { - FieldOrder::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "field_id", - |m: &FieldOrder| { &m.field_id }, - |m: &mut FieldOrder| { &mut m.field_id }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( - "visibility", - |m: &FieldOrder| { &m.visibility }, - |m: &mut FieldOrder| { &mut m.visibility }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "FieldOrder", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static FieldOrder { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(FieldOrder::new) - } -} - -impl ::protobuf::Clear for FieldOrder { - fn clear(&mut self) { - self.field_id.clear(); - self.visibility = false; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for FieldOrder { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for FieldOrder { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct RepeatedFieldOrder { - // message fields - pub items: ::protobuf::RepeatedField, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a RepeatedFieldOrder { - fn default() -> &'a RepeatedFieldOrder { - ::default_instance() - } -} - -impl RepeatedFieldOrder { - pub fn new() -> RepeatedFieldOrder { - ::std::default::Default::default() - } - - // repeated .FieldOrder items = 1; - - - pub fn get_items(&self) -> &[FieldOrder] { - &self.items - } - pub fn clear_items(&mut self) { - self.items.clear(); - } - - // Param is passed by value, moved - pub fn set_items(&mut self, v: ::protobuf::RepeatedField) { - self.items = v; - } - - // Mutable pointer to the field. - pub fn mut_items(&mut self) -> &mut ::protobuf::RepeatedField { - &mut self.items - } - - // Take field - pub fn take_items(&mut self) -> ::protobuf::RepeatedField { - ::std::mem::replace(&mut self.items, ::protobuf::RepeatedField::new()) - } -} - -impl ::protobuf::Message for RepeatedFieldOrder { - fn is_initialized(&self) -> bool { - for v in &self.items { - if !v.is_initialized() { - return false; - } - }; - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.items)?; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - for value in &self.items { - let len = value.compute_size(); - my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; - }; - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - for v in &self.items { - os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; - os.write_raw_varint32(v.get_cached_size())?; - v.write_to_with_cached_sizes(os)?; - }; - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> RepeatedFieldOrder { - RepeatedFieldOrder::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( - "items", - |m: &RepeatedFieldOrder| { &m.items }, - |m: &mut RepeatedFieldOrder| { &mut m.items }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "RepeatedFieldOrder", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static RepeatedFieldOrder { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(RepeatedFieldOrder::new) - } -} - -impl ::protobuf::Clear for RepeatedFieldOrder { - fn clear(&mut self) { - self.items.clear(); - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for RepeatedFieldOrder { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for RepeatedFieldOrder { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - #[derive(PartialEq,Clone,Default)] pub struct Field { // message fields pub id: ::std::string::String, pub name: ::std::string::String, pub desc: ::std::string::String, - pub field_type: FieldType, + pub field_type: super::meta::FieldType, pub frozen: bool, + pub visibility: bool, pub width: i32, - pub type_options: ::protobuf::SingularPtrField, // special fields pub unknown_fields: ::protobuf::UnknownFields, pub cached_size: ::protobuf::CachedSize, @@ -763,15 +387,15 @@ impl Field { // .FieldType field_type = 4; - pub fn get_field_type(&self) -> FieldType { + pub fn get_field_type(&self) -> super::meta::FieldType { self.field_type } pub fn clear_field_type(&mut self) { - self.field_type = FieldType::RichText; + self.field_type = super::meta::FieldType::RichText; } // Param is passed by value, moved - pub fn set_field_type(&mut self, v: FieldType) { + pub fn set_field_type(&mut self, v: super::meta::FieldType) { self.field_type = v; } @@ -790,7 +414,22 @@ impl Field { self.frozen = v; } - // int32 width = 6; + // bool visibility = 6; + + + pub fn get_visibility(&self) -> bool { + self.visibility + } + pub fn clear_visibility(&mut self) { + self.visibility = false; + } + + // Param is passed by value, moved + pub fn set_visibility(&mut self, v: bool) { + self.visibility = v; + } + + // int32 width = 7; pub fn get_width(&self) -> i32 { @@ -804,48 +443,10 @@ impl Field { pub fn set_width(&mut self, v: i32) { self.width = v; } - - // .AnyData type_options = 7; - - - pub fn get_type_options(&self) -> &AnyData { - self.type_options.as_ref().unwrap_or_else(|| ::default_instance()) - } - pub fn clear_type_options(&mut self) { - self.type_options.clear(); - } - - pub fn has_type_options(&self) -> bool { - self.type_options.is_some() - } - - // Param is passed by value, moved - pub fn set_type_options(&mut self, v: AnyData) { - self.type_options = ::protobuf::SingularPtrField::some(v); - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_type_options(&mut self) -> &mut AnyData { - if self.type_options.is_none() { - self.type_options.set_default(); - } - self.type_options.as_mut().unwrap() - } - - // Take field - pub fn take_type_options(&mut self) -> AnyData { - self.type_options.take().unwrap_or_else(|| AnyData::new()) - } } impl ::protobuf::Message for Field { fn is_initialized(&self) -> bool { - for v in &self.type_options { - if !v.is_initialized() { - return false; - } - }; true } @@ -876,11 +477,15 @@ impl ::protobuf::Message for Field { if wire_type != ::protobuf::wire_format::WireTypeVarint { return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); } - let tmp = is.read_int32()?; - self.width = tmp; + let tmp = is.read_bool()?; + self.visibility = tmp; }, 7 => { - ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.type_options)?; + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_int32()?; + self.width = tmp; }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; @@ -903,18 +508,17 @@ impl ::protobuf::Message for Field { if !self.desc.is_empty() { my_size += ::protobuf::rt::string_size(3, &self.desc); } - if self.field_type != FieldType::RichText { + if self.field_type != super::meta::FieldType::RichText { my_size += ::protobuf::rt::enum_size(4, self.field_type); } if self.frozen != false { my_size += 2; } - if self.width != 0 { - my_size += ::protobuf::rt::value_size(6, self.width, ::protobuf::wire_format::WireTypeVarint); + if self.visibility != false { + my_size += 2; } - if let Some(ref v) = self.type_options.as_ref() { - let len = v.compute_size(); - my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + if self.width != 0 { + my_size += ::protobuf::rt::value_size(7, self.width, ::protobuf::wire_format::WireTypeVarint); } my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); @@ -931,19 +535,17 @@ impl ::protobuf::Message for Field { if !self.desc.is_empty() { os.write_string(3, &self.desc)?; } - if self.field_type != FieldType::RichText { + if self.field_type != super::meta::FieldType::RichText { os.write_enum(4, ::protobuf::ProtobufEnum::value(&self.field_type))?; } if self.frozen != false { os.write_bool(5, self.frozen)?; } - if self.width != 0 { - os.write_int32(6, self.width)?; + if self.visibility != false { + os.write_bool(6, self.visibility)?; } - if let Some(ref v) = self.type_options.as_ref() { - os.write_tag(7, ::protobuf::wire_format::WireTypeLengthDelimited)?; - os.write_raw_varint32(v.get_cached_size())?; - v.write_to_with_cached_sizes(os)?; + if self.width != 0 { + os.write_int32(7, self.width)?; } os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) @@ -998,7 +600,7 @@ impl ::protobuf::Message for Field { |m: &Field| { &m.desc }, |m: &mut Field| { &mut m.desc }, )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( "field_type", |m: &Field| { &m.field_type }, |m: &mut Field| { &mut m.field_type }, @@ -1008,16 +610,16 @@ impl ::protobuf::Message for Field { |m: &Field| { &m.frozen }, |m: &mut Field| { &mut m.frozen }, )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( + "visibility", + |m: &Field| { &m.visibility }, + |m: &mut Field| { &mut m.visibility }, + )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>( "width", |m: &Field| { &m.width }, |m: &mut Field| { &mut m.width }, )); - fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( - "type_options", - |m: &Field| { &m.type_options }, - |m: &mut Field| { &mut m.type_options }, - )); ::protobuf::reflect::MessageDescriptor::new_pb_name::( "Field", fields, @@ -1037,10 +639,10 @@ impl ::protobuf::Clear for Field { self.id.clear(); self.name.clear(); self.desc.clear(); - self.field_type = FieldType::RichText; + self.field_type = super::meta::FieldType::RichText; self.frozen = false; + self.visibility = false; self.width = 0; - self.type_options.clear(); self.unknown_fields.clear(); } } @@ -1057,6 +659,165 @@ impl ::protobuf::reflect::ProtobufValue for Field { } } +#[derive(PartialEq,Clone,Default)] +pub struct FieldOrder { + // message fields + pub field_id: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a FieldOrder { + fn default() -> &'a FieldOrder { + ::default_instance() + } +} + +impl FieldOrder { + pub fn new() -> FieldOrder { + ::std::default::Default::default() + } + + // string field_id = 1; + + + pub fn get_field_id(&self) -> &str { + &self.field_id + } + pub fn clear_field_id(&mut self) { + self.field_id.clear(); + } + + // Param is passed by value, moved + pub fn set_field_id(&mut self, v: ::std::string::String) { + self.field_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_field_id(&mut self) -> &mut ::std::string::String { + &mut self.field_id + } + + // Take field + pub fn take_field_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.field_id, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for FieldOrder { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.field_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.field_id); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.field_id.is_empty() { + os.write_string(1, &self.field_id)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> FieldOrder { + FieldOrder::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "field_id", + |m: &FieldOrder| { &m.field_id }, + |m: &mut FieldOrder| { &mut m.field_id }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "FieldOrder", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static FieldOrder { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(FieldOrder::new) + } +} + +impl ::protobuf::Clear for FieldOrder { + fn clear(&mut self) { + self.field_id.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for FieldOrder { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for FieldOrder { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + #[derive(PartialEq,Clone,Default)] pub struct RepeatedField { // message fields @@ -1224,466 +985,29 @@ impl ::protobuf::reflect::ProtobufValue for RepeatedField { } #[derive(PartialEq,Clone,Default)] -pub struct AnyData { +pub struct RepeatedFieldOrder { // message fields - pub type_id: ::std::string::String, - pub value: ::std::vec::Vec, + pub items: ::protobuf::RepeatedField, // special fields pub unknown_fields: ::protobuf::UnknownFields, pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a AnyData { - fn default() -> &'a AnyData { - ::default_instance() +impl<'a> ::std::default::Default for &'a RepeatedFieldOrder { + fn default() -> &'a RepeatedFieldOrder { + ::default_instance() } } -impl AnyData { - pub fn new() -> AnyData { +impl RepeatedFieldOrder { + pub fn new() -> RepeatedFieldOrder { ::std::default::Default::default() } - // string type_id = 1; + // repeated .FieldOrder items = 1; - pub fn get_type_id(&self) -> &str { - &self.type_id - } - pub fn clear_type_id(&mut self) { - self.type_id.clear(); - } - - // Param is passed by value, moved - pub fn set_type_id(&mut self, v: ::std::string::String) { - self.type_id = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_type_id(&mut self) -> &mut ::std::string::String { - &mut self.type_id - } - - // Take field - pub fn take_type_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.type_id, ::std::string::String::new()) - } - - // bytes value = 2; - - - pub fn get_value(&self) -> &[u8] { - &self.value - } - pub fn clear_value(&mut self) { - self.value.clear(); - } - - // Param is passed by value, moved - pub fn set_value(&mut self, v: ::std::vec::Vec) { - self.value = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_value(&mut self) -> &mut ::std::vec::Vec { - &mut self.value - } - - // Take field - pub fn take_value(&mut self) -> ::std::vec::Vec { - ::std::mem::replace(&mut self.value, ::std::vec::Vec::new()) - } -} - -impl ::protobuf::Message for AnyData { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.type_id)?; - }, - 2 => { - ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.value)?; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if !self.type_id.is_empty() { - my_size += ::protobuf::rt::string_size(1, &self.type_id); - } - if !self.value.is_empty() { - my_size += ::protobuf::rt::bytes_size(2, &self.value); - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if !self.type_id.is_empty() { - os.write_string(1, &self.type_id)?; - } - if !self.value.is_empty() { - os.write_bytes(2, &self.value)?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> AnyData { - AnyData::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "type_id", - |m: &AnyData| { &m.type_id }, - |m: &mut AnyData| { &mut m.type_id }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>( - "value", - |m: &AnyData| { &m.value }, - |m: &mut AnyData| { &mut m.value }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "AnyData", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static AnyData { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(AnyData::new) - } -} - -impl ::protobuf::Clear for AnyData { - fn clear(&mut self) { - self.type_id.clear(); - self.value.clear(); - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for AnyData { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for AnyData { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct RowOrder { - // message fields - pub grid_id: ::std::string::String, - pub row_id: ::std::string::String, - pub visibility: bool, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a RowOrder { - fn default() -> &'a RowOrder { - ::default_instance() - } -} - -impl RowOrder { - pub fn new() -> RowOrder { - ::std::default::Default::default() - } - - // string grid_id = 1; - - - pub fn get_grid_id(&self) -> &str { - &self.grid_id - } - pub fn clear_grid_id(&mut self) { - self.grid_id.clear(); - } - - // Param is passed by value, moved - pub fn set_grid_id(&mut self, v: ::std::string::String) { - self.grid_id = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_grid_id(&mut self) -> &mut ::std::string::String { - &mut self.grid_id - } - - // Take field - pub fn take_grid_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.grid_id, ::std::string::String::new()) - } - - // string row_id = 2; - - - pub fn get_row_id(&self) -> &str { - &self.row_id - } - pub fn clear_row_id(&mut self) { - self.row_id.clear(); - } - - // Param is passed by value, moved - pub fn set_row_id(&mut self, v: ::std::string::String) { - self.row_id = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_row_id(&mut self) -> &mut ::std::string::String { - &mut self.row_id - } - - // Take field - pub fn take_row_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.row_id, ::std::string::String::new()) - } - - // bool visibility = 3; - - - pub fn get_visibility(&self) -> bool { - self.visibility - } - pub fn clear_visibility(&mut self) { - self.visibility = false; - } - - // Param is passed by value, moved - pub fn set_visibility(&mut self, v: bool) { - self.visibility = v; - } -} - -impl ::protobuf::Message for RowOrder { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?; - }, - 2 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_id)?; - }, - 3 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_bool()?; - self.visibility = tmp; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if !self.grid_id.is_empty() { - my_size += ::protobuf::rt::string_size(1, &self.grid_id); - } - if !self.row_id.is_empty() { - my_size += ::protobuf::rt::string_size(2, &self.row_id); - } - if self.visibility != false { - my_size += 2; - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if !self.grid_id.is_empty() { - os.write_string(1, &self.grid_id)?; - } - if !self.row_id.is_empty() { - os.write_string(2, &self.row_id)?; - } - if self.visibility != false { - os.write_bool(3, self.visibility)?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> RowOrder { - RowOrder::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "grid_id", - |m: &RowOrder| { &m.grid_id }, - |m: &mut RowOrder| { &mut m.grid_id }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "row_id", - |m: &RowOrder| { &m.row_id }, - |m: &mut RowOrder| { &mut m.row_id }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( - "visibility", - |m: &RowOrder| { &m.visibility }, - |m: &mut RowOrder| { &mut m.visibility }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "RowOrder", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static RowOrder { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(RowOrder::new) - } -} - -impl ::protobuf::Clear for RowOrder { - fn clear(&mut self) { - self.grid_id.clear(); - self.row_id.clear(); - self.visibility = false; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for RowOrder { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for RowOrder { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct RepeatedRowOrder { - // message fields - pub items: ::protobuf::RepeatedField, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a RepeatedRowOrder { - fn default() -> &'a RepeatedRowOrder { - ::default_instance() - } -} - -impl RepeatedRowOrder { - pub fn new() -> RepeatedRowOrder { - ::std::default::Default::default() - } - - // repeated .RowOrder items = 1; - - - pub fn get_items(&self) -> &[RowOrder] { + pub fn get_items(&self) -> &[FieldOrder] { &self.items } pub fn clear_items(&mut self) { @@ -1691,22 +1015,22 @@ impl RepeatedRowOrder { } // Param is passed by value, moved - pub fn set_items(&mut self, v: ::protobuf::RepeatedField) { + pub fn set_items(&mut self, v: ::protobuf::RepeatedField) { self.items = v; } // Mutable pointer to the field. - pub fn mut_items(&mut self) -> &mut ::protobuf::RepeatedField { + pub fn mut_items(&mut self) -> &mut ::protobuf::RepeatedField { &mut self.items } // Take field - pub fn take_items(&mut self) -> ::protobuf::RepeatedField { + pub fn take_items(&mut self) -> ::protobuf::RepeatedField { ::std::mem::replace(&mut self.items, ::protobuf::RepeatedField::new()) } } -impl ::protobuf::Message for RepeatedRowOrder { +impl ::protobuf::Message for RepeatedFieldOrder { fn is_initialized(&self) -> bool { for v in &self.items { if !v.is_initialized() { @@ -1780,340 +1104,75 @@ impl ::protobuf::Message for RepeatedRowOrder { Self::descriptor_static() } - fn new() -> RepeatedRowOrder { - RepeatedRowOrder::new() + fn new() -> RepeatedFieldOrder { + RepeatedFieldOrder::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; descriptor.get(|| { let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( "items", - |m: &RepeatedRowOrder| { &m.items }, - |m: &mut RepeatedRowOrder| { &mut m.items }, + |m: &RepeatedFieldOrder| { &m.items }, + |m: &mut RepeatedFieldOrder| { &mut m.items }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "RepeatedRowOrder", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "RepeatedFieldOrder", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static RepeatedRowOrder { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(RepeatedRowOrder::new) + fn default_instance() -> &'static RepeatedFieldOrder { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(RepeatedFieldOrder::new) } } -impl ::protobuf::Clear for RepeatedRowOrder { +impl ::protobuf::Clear for RepeatedFieldOrder { fn clear(&mut self) { self.items.clear(); self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for RepeatedRowOrder { +impl ::std::fmt::Debug for RepeatedFieldOrder { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for RepeatedRowOrder { +impl ::protobuf::reflect::ProtobufValue for RepeatedFieldOrder { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } } #[derive(PartialEq,Clone,Default)] -pub struct RawRow { +pub struct RowOrder { // message fields - pub id: ::std::string::String, - pub grid_id: ::std::string::String, - pub cell_by_field_id: ::std::collections::HashMap<::std::string::String, RawCell>, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a RawRow { - fn default() -> &'a RawRow { - ::default_instance() - } -} - -impl RawRow { - pub fn new() -> RawRow { - ::std::default::Default::default() - } - - // string id = 1; - - - pub fn get_id(&self) -> &str { - &self.id - } - pub fn clear_id(&mut self) { - self.id.clear(); - } - - // Param is passed by value, moved - pub fn set_id(&mut self, v: ::std::string::String) { - self.id = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_id(&mut self) -> &mut ::std::string::String { - &mut self.id - } - - // Take field - pub fn take_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.id, ::std::string::String::new()) - } - - // string grid_id = 2; - - - pub fn get_grid_id(&self) -> &str { - &self.grid_id - } - pub fn clear_grid_id(&mut self) { - self.grid_id.clear(); - } - - // Param is passed by value, moved - pub fn set_grid_id(&mut self, v: ::std::string::String) { - self.grid_id = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_grid_id(&mut self) -> &mut ::std::string::String { - &mut self.grid_id - } - - // Take field - pub fn take_grid_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.grid_id, ::std::string::String::new()) - } - - // repeated .RawRow.CellByFieldIdEntry cell_by_field_id = 3; - - - pub fn get_cell_by_field_id(&self) -> &::std::collections::HashMap<::std::string::String, RawCell> { - &self.cell_by_field_id - } - pub fn clear_cell_by_field_id(&mut self) { - self.cell_by_field_id.clear(); - } - - // Param is passed by value, moved - pub fn set_cell_by_field_id(&mut self, v: ::std::collections::HashMap<::std::string::String, RawCell>) { - self.cell_by_field_id = v; - } - - // Mutable pointer to the field. - pub fn mut_cell_by_field_id(&mut self) -> &mut ::std::collections::HashMap<::std::string::String, RawCell> { - &mut self.cell_by_field_id - } - - // Take field - pub fn take_cell_by_field_id(&mut self) -> ::std::collections::HashMap<::std::string::String, RawCell> { - ::std::mem::replace(&mut self.cell_by_field_id, ::std::collections::HashMap::new()) - } -} - -impl ::protobuf::Message for RawRow { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; - }, - 2 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?; - }, - 3 => { - ::protobuf::rt::read_map_into::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(wire_type, is, &mut self.cell_by_field_id)?; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if !self.id.is_empty() { - my_size += ::protobuf::rt::string_size(1, &self.id); - } - if !self.grid_id.is_empty() { - my_size += ::protobuf::rt::string_size(2, &self.grid_id); - } - my_size += ::protobuf::rt::compute_map_size::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(3, &self.cell_by_field_id); - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if !self.id.is_empty() { - os.write_string(1, &self.id)?; - } - if !self.grid_id.is_empty() { - os.write_string(2, &self.grid_id)?; - } - ::protobuf::rt::write_map_with_cached_sizes::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(3, &self.cell_by_field_id, os)?; - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> RawRow { - RawRow::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "id", - |m: &RawRow| { &m.id }, - |m: &mut RawRow| { &mut m.id }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "grid_id", - |m: &RawRow| { &m.grid_id }, - |m: &mut RawRow| { &mut m.grid_id }, - )); - fields.push(::protobuf::reflect::accessor::make_map_accessor::<_, ::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>( - "cell_by_field_id", - |m: &RawRow| { &m.cell_by_field_id }, - |m: &mut RawRow| { &mut m.cell_by_field_id }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "RawRow", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static RawRow { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(RawRow::new) - } -} - -impl ::protobuf::Clear for RawRow { - fn clear(&mut self) { - self.id.clear(); - self.grid_id.clear(); - self.cell_by_field_id.clear(); - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for RawRow { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for RawRow { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct RawCell { - // message fields - pub id: ::std::string::String, pub row_id: ::std::string::String, - pub field_id: ::std::string::String, - pub data: ::protobuf::SingularPtrField, + pub block_id: ::std::string::String, + pub height: i32, // special fields pub unknown_fields: ::protobuf::UnknownFields, pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a RawCell { - fn default() -> &'a RawCell { - ::default_instance() +impl<'a> ::std::default::Default for &'a RowOrder { + fn default() -> &'a RowOrder { + ::default_instance() } } -impl RawCell { - pub fn new() -> RawCell { +impl RowOrder { + pub fn new() -> RowOrder { ::std::default::Default::default() } - // string id = 1; - - - pub fn get_id(&self) -> &str { - &self.id - } - pub fn clear_id(&mut self) { - self.id.clear(); - } - - // Param is passed by value, moved - pub fn set_id(&mut self, v: ::std::string::String) { - self.id = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_id(&mut self) -> &mut ::std::string::String { - &mut self.id - } - - // Take field - pub fn take_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.id, ::std::string::String::new()) - } - - // string row_id = 2; + // string row_id = 1; pub fn get_row_id(&self) -> &str { @@ -2139,73 +1198,50 @@ impl RawCell { ::std::mem::replace(&mut self.row_id, ::std::string::String::new()) } - // string field_id = 3; + // string block_id = 2; - pub fn get_field_id(&self) -> &str { - &self.field_id + pub fn get_block_id(&self) -> &str { + &self.block_id } - pub fn clear_field_id(&mut self) { - self.field_id.clear(); + pub fn clear_block_id(&mut self) { + self.block_id.clear(); } // Param is passed by value, moved - pub fn set_field_id(&mut self, v: ::std::string::String) { - self.field_id = v; + pub fn set_block_id(&mut self, v: ::std::string::String) { + self.block_id = v; } // Mutable pointer to the field. // If field is not initialized, it is initialized with default value first. - pub fn mut_field_id(&mut self) -> &mut ::std::string::String { - &mut self.field_id + pub fn mut_block_id(&mut self) -> &mut ::std::string::String { + &mut self.block_id } // Take field - pub fn take_field_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.field_id, ::std::string::String::new()) + pub fn take_block_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.block_id, ::std::string::String::new()) } - // .AnyData data = 4; + // int32 height = 3; - pub fn get_data(&self) -> &AnyData { - self.data.as_ref().unwrap_or_else(|| ::default_instance()) + pub fn get_height(&self) -> i32 { + self.height } - pub fn clear_data(&mut self) { - self.data.clear(); - } - - pub fn has_data(&self) -> bool { - self.data.is_some() + pub fn clear_height(&mut self) { + self.height = 0; } // Param is passed by value, moved - pub fn set_data(&mut self, v: AnyData) { - self.data = ::protobuf::SingularPtrField::some(v); - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_data(&mut self) -> &mut AnyData { - if self.data.is_none() { - self.data.set_default(); - } - self.data.as_mut().unwrap() - } - - // Take field - pub fn take_data(&mut self) -> AnyData { - self.data.take().unwrap_or_else(|| AnyData::new()) + pub fn set_height(&mut self, v: i32) { + self.height = v; } } -impl ::protobuf::Message for RawCell { +impl ::protobuf::Message for RowOrder { fn is_initialized(&self) -> bool { - for v in &self.data { - if !v.is_initialized() { - return false; - } - }; true } @@ -2214,16 +1250,17 @@ impl ::protobuf::Message for RawCell { let (field_number, wire_type) = is.read_tag_unpack()?; match field_number { 1 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; - }, - 2 => { ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_id)?; }, - 3 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?; + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.block_id)?; }, - 4 => { - ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.data)?; + 3 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_int32()?; + self.height = tmp; }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; @@ -2237,18 +1274,14 @@ impl ::protobuf::Message for RawCell { #[allow(unused_variables)] fn compute_size(&self) -> u32 { let mut my_size = 0; - if !self.id.is_empty() { - my_size += ::protobuf::rt::string_size(1, &self.id); - } if !self.row_id.is_empty() { - my_size += ::protobuf::rt::string_size(2, &self.row_id); + my_size += ::protobuf::rt::string_size(1, &self.row_id); } - if !self.field_id.is_empty() { - my_size += ::protobuf::rt::string_size(3, &self.field_id); + if !self.block_id.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.block_id); } - if let Some(ref v) = self.data.as_ref() { - let len = v.compute_size(); - my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + if self.height != 0 { + my_size += ::protobuf::rt::value_size(3, self.height, ::protobuf::wire_format::WireTypeVarint); } my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); @@ -2256,19 +1289,14 @@ impl ::protobuf::Message for RawCell { } fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if !self.id.is_empty() { - os.write_string(1, &self.id)?; - } if !self.row_id.is_empty() { - os.write_string(2, &self.row_id)?; + os.write_string(1, &self.row_id)?; } - if !self.field_id.is_empty() { - os.write_string(3, &self.field_id)?; + if !self.block_id.is_empty() { + os.write_string(2, &self.block_id)?; } - if let Some(ref v) = self.data.as_ref() { - os.write_tag(4, ::protobuf::wire_format::WireTypeLengthDelimited)?; - os.write_raw_varint32(v.get_cached_size())?; - v.write_to_with_cached_sizes(os)?; + if self.height != 0 { + os.write_int32(3, self.height)?; } os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) @@ -2300,8 +1328,239 @@ impl ::protobuf::Message for RawCell { Self::descriptor_static() } - fn new() -> RawCell { - RawCell::new() + fn new() -> RowOrder { + RowOrder::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "row_id", + |m: &RowOrder| { &m.row_id }, + |m: &mut RowOrder| { &mut m.row_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "block_id", + |m: &RowOrder| { &m.block_id }, + |m: &mut RowOrder| { &mut m.block_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>( + "height", + |m: &RowOrder| { &m.height }, + |m: &mut RowOrder| { &mut m.height }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "RowOrder", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static RowOrder { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(RowOrder::new) + } +} + +impl ::protobuf::Clear for RowOrder { + fn clear(&mut self) { + self.row_id.clear(); + self.block_id.clear(); + self.height = 0; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for RowOrder { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for RowOrder { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct Row { + // message fields + pub id: ::std::string::String, + pub cell_by_field_id: ::std::collections::HashMap<::std::string::String, Cell>, + pub height: i32, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a Row { + fn default() -> &'a Row { + ::default_instance() + } +} + +impl Row { + pub fn new() -> Row { + ::std::default::Default::default() + } + + // string id = 1; + + + pub fn get_id(&self) -> &str { + &self.id + } + pub fn clear_id(&mut self) { + self.id.clear(); + } + + // Param is passed by value, moved + pub fn set_id(&mut self, v: ::std::string::String) { + self.id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_id(&mut self) -> &mut ::std::string::String { + &mut self.id + } + + // Take field + pub fn take_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.id, ::std::string::String::new()) + } + + // repeated .Row.CellByFieldIdEntry cell_by_field_id = 2; + + + pub fn get_cell_by_field_id(&self) -> &::std::collections::HashMap<::std::string::String, Cell> { + &self.cell_by_field_id + } + pub fn clear_cell_by_field_id(&mut self) { + self.cell_by_field_id.clear(); + } + + // Param is passed by value, moved + pub fn set_cell_by_field_id(&mut self, v: ::std::collections::HashMap<::std::string::String, Cell>) { + self.cell_by_field_id = v; + } + + // Mutable pointer to the field. + pub fn mut_cell_by_field_id(&mut self) -> &mut ::std::collections::HashMap<::std::string::String, Cell> { + &mut self.cell_by_field_id + } + + // Take field + pub fn take_cell_by_field_id(&mut self) -> ::std::collections::HashMap<::std::string::String, Cell> { + ::std::mem::replace(&mut self.cell_by_field_id, ::std::collections::HashMap::new()) + } + + // int32 height = 3; + + + pub fn get_height(&self) -> i32 { + self.height + } + pub fn clear_height(&mut self) { + self.height = 0; + } + + // Param is passed by value, moved + pub fn set_height(&mut self, v: i32) { + self.height = v; + } +} + +impl ::protobuf::Message for Row { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; + }, + 2 => { + ::protobuf::rt::read_map_into::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(wire_type, is, &mut self.cell_by_field_id)?; + }, + 3 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_int32()?; + self.height = tmp; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.id); + } + my_size += ::protobuf::rt::compute_map_size::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(2, &self.cell_by_field_id); + if self.height != 0 { + my_size += ::protobuf::rt::value_size(3, self.height, ::protobuf::wire_format::WireTypeVarint); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.id.is_empty() { + os.write_string(1, &self.id)?; + } + ::protobuf::rt::write_map_with_cached_sizes::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(2, &self.cell_by_field_id, os)?; + if self.height != 0 { + os.write_int32(3, self.height)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> Row { + Row::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -2310,55 +1569,49 @@ impl ::protobuf::Message for RawCell { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "id", - |m: &RawCell| { &m.id }, - |m: &mut RawCell| { &mut m.id }, + |m: &Row| { &m.id }, + |m: &mut Row| { &mut m.id }, )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "row_id", - |m: &RawCell| { &m.row_id }, - |m: &mut RawCell| { &mut m.row_id }, + fields.push(::protobuf::reflect::accessor::make_map_accessor::<_, ::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>( + "cell_by_field_id", + |m: &Row| { &m.cell_by_field_id }, + |m: &mut Row| { &mut m.cell_by_field_id }, )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "field_id", - |m: &RawCell| { &m.field_id }, - |m: &mut RawCell| { &mut m.field_id }, + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>( + "height", + |m: &Row| { &m.height }, + |m: &mut Row| { &mut m.height }, )); - fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( - "data", - |m: &RawCell| { &m.data }, - |m: &mut RawCell| { &mut m.data }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "RawCell", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "Row", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static RawCell { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(RawCell::new) + fn default_instance() -> &'static Row { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(Row::new) } } -impl ::protobuf::Clear for RawCell { +impl ::protobuf::Clear for Row { fn clear(&mut self) { self.id.clear(); - self.row_id.clear(); - self.field_id.clear(); - self.data.clear(); + self.cell_by_field_id.clear(); + self.height = 0; self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for RawCell { +impl ::std::fmt::Debug for Row { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for RawCell { +impl ::protobuf::reflect::ProtobufValue for Row { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } @@ -2531,80 +1784,58 @@ impl ::protobuf::reflect::ProtobufValue for RepeatedRow { } #[derive(PartialEq,Clone,Default)] -pub struct Row { +pub struct RepeatedGridBlock { // message fields - pub id: ::std::string::String, - pub cell_by_field_id: ::std::collections::HashMap<::std::string::String, Cell>, + pub items: ::protobuf::RepeatedField, // special fields pub unknown_fields: ::protobuf::UnknownFields, pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a Row { - fn default() -> &'a Row { - ::default_instance() +impl<'a> ::std::default::Default for &'a RepeatedGridBlock { + fn default() -> &'a RepeatedGridBlock { + ::default_instance() } } -impl Row { - pub fn new() -> Row { +impl RepeatedGridBlock { + pub fn new() -> RepeatedGridBlock { ::std::default::Default::default() } - // string id = 1; + // repeated .GridBlock items = 1; - pub fn get_id(&self) -> &str { - &self.id + pub fn get_items(&self) -> &[GridBlock] { + &self.items } - pub fn clear_id(&mut self) { - self.id.clear(); + pub fn clear_items(&mut self) { + self.items.clear(); } // Param is passed by value, moved - pub fn set_id(&mut self, v: ::std::string::String) { - self.id = v; + pub fn set_items(&mut self, v: ::protobuf::RepeatedField) { + self.items = v; } // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_id(&mut self) -> &mut ::std::string::String { - &mut self.id + pub fn mut_items(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.items } // Take field - pub fn take_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.id, ::std::string::String::new()) - } - - // repeated .Row.CellByFieldIdEntry cell_by_field_id = 2; - - - pub fn get_cell_by_field_id(&self) -> &::std::collections::HashMap<::std::string::String, Cell> { - &self.cell_by_field_id - } - pub fn clear_cell_by_field_id(&mut self) { - self.cell_by_field_id.clear(); - } - - // Param is passed by value, moved - pub fn set_cell_by_field_id(&mut self, v: ::std::collections::HashMap<::std::string::String, Cell>) { - self.cell_by_field_id = v; - } - - // Mutable pointer to the field. - pub fn mut_cell_by_field_id(&mut self) -> &mut ::std::collections::HashMap<::std::string::String, Cell> { - &mut self.cell_by_field_id - } - - // Take field - pub fn take_cell_by_field_id(&mut self) -> ::std::collections::HashMap<::std::string::String, Cell> { - ::std::mem::replace(&mut self.cell_by_field_id, ::std::collections::HashMap::new()) + pub fn take_items(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.items, ::protobuf::RepeatedField::new()) } } -impl ::protobuf::Message for Row { +impl ::protobuf::Message for RepeatedGridBlock { fn is_initialized(&self) -> bool { + for v in &self.items { + if !v.is_initialized() { + return false; + } + }; true } @@ -2613,10 +1844,7 @@ impl ::protobuf::Message for Row { let (field_number, wire_type) = is.read_tag_unpack()?; match field_number { 1 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; - }, - 2 => { - ::protobuf::rt::read_map_into::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(wire_type, is, &mut self.cell_by_field_id)?; + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.items)?; }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; @@ -2630,20 +1858,21 @@ impl ::protobuf::Message for Row { #[allow(unused_variables)] fn compute_size(&self) -> u32 { let mut my_size = 0; - if !self.id.is_empty() { - my_size += ::protobuf::rt::string_size(1, &self.id); - } - my_size += ::protobuf::rt::compute_map_size::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(2, &self.cell_by_field_id); + for value in &self.items { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); my_size } fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if !self.id.is_empty() { - os.write_string(1, &self.id)?; - } - ::protobuf::rt::write_map_with_cached_sizes::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(2, &self.cell_by_field_id, os)?; + for v in &self.items { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) } @@ -2674,8 +1903,167 @@ impl ::protobuf::Message for Row { Self::descriptor_static() } - fn new() -> Row { - Row::new() + fn new() -> RepeatedGridBlock { + RepeatedGridBlock::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "items", + |m: &RepeatedGridBlock| { &m.items }, + |m: &mut RepeatedGridBlock| { &mut m.items }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "RepeatedGridBlock", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static RepeatedGridBlock { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(RepeatedGridBlock::new) + } +} + +impl ::protobuf::Clear for RepeatedGridBlock { + fn clear(&mut self) { + self.items.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for RepeatedGridBlock { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for RepeatedGridBlock { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct GridBlockOrder { + // message fields + pub block_id: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a GridBlockOrder { + fn default() -> &'a GridBlockOrder { + ::default_instance() + } +} + +impl GridBlockOrder { + pub fn new() -> GridBlockOrder { + ::std::default::Default::default() + } + + // string block_id = 1; + + + pub fn get_block_id(&self) -> &str { + &self.block_id + } + pub fn clear_block_id(&mut self) { + self.block_id.clear(); + } + + // Param is passed by value, moved + pub fn set_block_id(&mut self, v: ::std::string::String) { + self.block_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_block_id(&mut self) -> &mut ::std::string::String { + &mut self.block_id + } + + // Take field + pub fn take_block_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.block_id, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for GridBlockOrder { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.block_id)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.block_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.block_id); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.block_id.is_empty() { + os.write_string(1, &self.block_id)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> GridBlockOrder { + GridBlockOrder::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -2683,44 +2071,246 @@ impl ::protobuf::Message for Row { descriptor.get(|| { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "id", - |m: &Row| { &m.id }, - |m: &mut Row| { &mut m.id }, + "block_id", + |m: &GridBlockOrder| { &m.block_id }, + |m: &mut GridBlockOrder| { &mut m.block_id }, )); - fields.push(::protobuf::reflect::accessor::make_map_accessor::<_, ::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>( - "cell_by_field_id", - |m: &Row| { &m.cell_by_field_id }, - |m: &mut Row| { &mut m.cell_by_field_id }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "Row", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "GridBlockOrder", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static Row { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(Row::new) + fn default_instance() -> &'static GridBlockOrder { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(GridBlockOrder::new) } } -impl ::protobuf::Clear for Row { +impl ::protobuf::Clear for GridBlockOrder { fn clear(&mut self) { - self.id.clear(); - self.cell_by_field_id.clear(); + self.block_id.clear(); self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for Row { +impl ::std::fmt::Debug for GridBlockOrder { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for Row { +impl ::protobuf::reflect::ProtobufValue for GridBlockOrder { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct GridBlock { + // message fields + pub block_id: ::std::string::String, + pub row_orders: ::protobuf::RepeatedField, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a GridBlock { + fn default() -> &'a GridBlock { + ::default_instance() + } +} + +impl GridBlock { + pub fn new() -> GridBlock { + ::std::default::Default::default() + } + + // string block_id = 1; + + + pub fn get_block_id(&self) -> &str { + &self.block_id + } + pub fn clear_block_id(&mut self) { + self.block_id.clear(); + } + + // Param is passed by value, moved + pub fn set_block_id(&mut self, v: ::std::string::String) { + self.block_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_block_id(&mut self) -> &mut ::std::string::String { + &mut self.block_id + } + + // Take field + pub fn take_block_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.block_id, ::std::string::String::new()) + } + + // repeated .RowOrder row_orders = 2; + + + pub fn get_row_orders(&self) -> &[RowOrder] { + &self.row_orders + } + pub fn clear_row_orders(&mut self) { + self.row_orders.clear(); + } + + // Param is passed by value, moved + pub fn set_row_orders(&mut self, v: ::protobuf::RepeatedField) { + self.row_orders = v; + } + + // Mutable pointer to the field. + pub fn mut_row_orders(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.row_orders + } + + // Take field + pub fn take_row_orders(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.row_orders, ::protobuf::RepeatedField::new()) + } +} + +impl ::protobuf::Message for GridBlock { + fn is_initialized(&self) -> bool { + for v in &self.row_orders { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.block_id)?; + }, + 2 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.row_orders)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.block_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.block_id); + } + for value in &self.row_orders { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.block_id.is_empty() { + os.write_string(1, &self.block_id)?; + } + for v in &self.row_orders { + os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> GridBlock { + GridBlock::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "block_id", + |m: &GridBlock| { &m.block_id }, + |m: &mut GridBlock| { &mut m.block_id }, + )); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "row_orders", + |m: &GridBlock| { &m.row_orders }, + |m: &mut GridBlock| { &mut m.row_orders }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "GridBlock", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static GridBlock { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(GridBlock::new) + } +} + +impl ::protobuf::Clear for GridBlock { + fn clear(&mut self) { + self.block_id.clear(); + self.row_orders.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for GridBlock { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for GridBlock { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } @@ -2729,7 +2319,6 @@ impl ::protobuf::reflect::ProtobufValue for Row { #[derive(PartialEq,Clone,Default)] pub struct Cell { // message fields - pub id: ::std::string::String, pub field_id: ::std::string::String, pub content: ::std::string::String, // special fields @@ -2748,33 +2337,7 @@ impl Cell { ::std::default::Default::default() } - // string id = 1; - - - pub fn get_id(&self) -> &str { - &self.id - } - pub fn clear_id(&mut self) { - self.id.clear(); - } - - // Param is passed by value, moved - pub fn set_id(&mut self, v: ::std::string::String) { - self.id = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_id(&mut self) -> &mut ::std::string::String { - &mut self.id - } - - // Take field - pub fn take_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.id, ::std::string::String::new()) - } - - // string field_id = 2; + // string field_id = 1; pub fn get_field_id(&self) -> &str { @@ -2800,7 +2363,7 @@ impl Cell { ::std::mem::replace(&mut self.field_id, ::std::string::String::new()) } - // string content = 3; + // string content = 2; pub fn get_content(&self) -> &str { @@ -2837,12 +2400,9 @@ impl ::protobuf::Message for Cell { let (field_number, wire_type) = is.read_tag_unpack()?; match field_number { 1 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; - }, - 2 => { ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?; }, - 3 => { + 2 => { ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.content)?; }, _ => { @@ -2857,14 +2417,11 @@ impl ::protobuf::Message for Cell { #[allow(unused_variables)] fn compute_size(&self) -> u32 { let mut my_size = 0; - if !self.id.is_empty() { - my_size += ::protobuf::rt::string_size(1, &self.id); - } if !self.field_id.is_empty() { - my_size += ::protobuf::rt::string_size(2, &self.field_id); + my_size += ::protobuf::rt::string_size(1, &self.field_id); } if !self.content.is_empty() { - my_size += ::protobuf::rt::string_size(3, &self.content); + my_size += ::protobuf::rt::string_size(2, &self.content); } my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); @@ -2872,14 +2429,11 @@ impl ::protobuf::Message for Cell { } fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if !self.id.is_empty() { - os.write_string(1, &self.id)?; - } if !self.field_id.is_empty() { - os.write_string(2, &self.field_id)?; + os.write_string(1, &self.field_id)?; } if !self.content.is_empty() { - os.write_string(3, &self.content)?; + os.write_string(2, &self.content)?; } os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) @@ -2919,11 +2473,6 @@ impl ::protobuf::Message for Cell { static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; descriptor.get(|| { let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "id", - |m: &Cell| { &m.id }, - |m: &mut Cell| { &mut m.id }, - )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "field_id", |m: &Cell| { &m.field_id }, @@ -2950,7 +2499,6 @@ impl ::protobuf::Message for Cell { impl ::protobuf::Clear for Cell { fn clear(&mut self) { - self.id.clear(); self.field_id.clear(); self.content.clear(); self.unknown_fields.clear(); @@ -2970,135 +2518,58 @@ impl ::protobuf::reflect::ProtobufValue for Cell { } #[derive(PartialEq,Clone,Default)] -pub struct CellChangeset { +pub struct RepeatedCell { // message fields - pub id: ::std::string::String, - pub row_id: ::std::string::String, - pub field_id: ::std::string::String, - pub data: ::std::string::String, + pub items: ::protobuf::RepeatedField, // special fields pub unknown_fields: ::protobuf::UnknownFields, pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a CellChangeset { - fn default() -> &'a CellChangeset { - ::default_instance() +impl<'a> ::std::default::Default for &'a RepeatedCell { + fn default() -> &'a RepeatedCell { + ::default_instance() } } -impl CellChangeset { - pub fn new() -> CellChangeset { +impl RepeatedCell { + pub fn new() -> RepeatedCell { ::std::default::Default::default() } - // string id = 1; + // repeated .Cell items = 1; - pub fn get_id(&self) -> &str { - &self.id + pub fn get_items(&self) -> &[Cell] { + &self.items } - pub fn clear_id(&mut self) { - self.id.clear(); + pub fn clear_items(&mut self) { + self.items.clear(); } // Param is passed by value, moved - pub fn set_id(&mut self, v: ::std::string::String) { - self.id = v; + pub fn set_items(&mut self, v: ::protobuf::RepeatedField) { + self.items = v; } // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_id(&mut self) -> &mut ::std::string::String { - &mut self.id + pub fn mut_items(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.items } // Take field - pub fn take_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.id, ::std::string::String::new()) - } - - // string row_id = 2; - - - pub fn get_row_id(&self) -> &str { - &self.row_id - } - pub fn clear_row_id(&mut self) { - self.row_id.clear(); - } - - // Param is passed by value, moved - pub fn set_row_id(&mut self, v: ::std::string::String) { - self.row_id = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_row_id(&mut self) -> &mut ::std::string::String { - &mut self.row_id - } - - // Take field - pub fn take_row_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.row_id, ::std::string::String::new()) - } - - // string field_id = 3; - - - pub fn get_field_id(&self) -> &str { - &self.field_id - } - pub fn clear_field_id(&mut self) { - self.field_id.clear(); - } - - // Param is passed by value, moved - pub fn set_field_id(&mut self, v: ::std::string::String) { - self.field_id = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_field_id(&mut self) -> &mut ::std::string::String { - &mut self.field_id - } - - // Take field - pub fn take_field_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.field_id, ::std::string::String::new()) - } - - // string data = 4; - - - pub fn get_data(&self) -> &str { - &self.data - } - pub fn clear_data(&mut self) { - self.data.clear(); - } - - // Param is passed by value, moved - pub fn set_data(&mut self, v: ::std::string::String) { - self.data = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_data(&mut self) -> &mut ::std::string::String { - &mut self.data - } - - // Take field - pub fn take_data(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.data, ::std::string::String::new()) + pub fn take_items(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.items, ::protobuf::RepeatedField::new()) } } -impl ::protobuf::Message for CellChangeset { +impl ::protobuf::Message for RepeatedCell { fn is_initialized(&self) -> bool { + for v in &self.items { + if !v.is_initialized() { + return false; + } + }; true } @@ -3107,16 +2578,7 @@ impl ::protobuf::Message for CellChangeset { let (field_number, wire_type) = is.read_tag_unpack()?; match field_number { 1 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; - }, - 2 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_id)?; - }, - 3 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?; - }, - 4 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.data)?; + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.items)?; }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; @@ -3130,36 +2592,21 @@ impl ::protobuf::Message for CellChangeset { #[allow(unused_variables)] fn compute_size(&self) -> u32 { let mut my_size = 0; - if !self.id.is_empty() { - my_size += ::protobuf::rt::string_size(1, &self.id); - } - if !self.row_id.is_empty() { - my_size += ::protobuf::rt::string_size(2, &self.row_id); - } - if !self.field_id.is_empty() { - my_size += ::protobuf::rt::string_size(3, &self.field_id); - } - if !self.data.is_empty() { - my_size += ::protobuf::rt::string_size(4, &self.data); - } + for value in &self.items { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); my_size } fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if !self.id.is_empty() { - os.write_string(1, &self.id)?; - } - if !self.row_id.is_empty() { - os.write_string(2, &self.row_id)?; - } - if !self.field_id.is_empty() { - os.write_string(3, &self.field_id)?; - } - if !self.data.is_empty() { - os.write_string(4, &self.data)?; - } + for v in &self.items { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) } @@ -3190,65 +2637,47 @@ impl ::protobuf::Message for CellChangeset { Self::descriptor_static() } - fn new() -> CellChangeset { - CellChangeset::new() + fn new() -> RepeatedCell { + RepeatedCell::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; descriptor.get(|| { let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "id", - |m: &CellChangeset| { &m.id }, - |m: &mut CellChangeset| { &mut m.id }, + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "items", + |m: &RepeatedCell| { &m.items }, + |m: &mut RepeatedCell| { &mut m.items }, )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "row_id", - |m: &CellChangeset| { &m.row_id }, - |m: &mut CellChangeset| { &mut m.row_id }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "field_id", - |m: &CellChangeset| { &m.field_id }, - |m: &mut CellChangeset| { &mut m.field_id }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "data", - |m: &CellChangeset| { &m.data }, - |m: &mut CellChangeset| { &mut m.data }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "CellChangeset", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "RepeatedCell", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static CellChangeset { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(CellChangeset::new) + fn default_instance() -> &'static RepeatedCell { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(RepeatedCell::new) } } -impl ::protobuf::Clear for CellChangeset { +impl ::protobuf::Clear for RepeatedCell { fn clear(&mut self) { - self.id.clear(); - self.row_id.clear(); - self.field_id.clear(); - self.data.clear(); + self.items.clear(); self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for CellChangeset { +impl ::std::fmt::Debug for RepeatedCell { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for CellChangeset { +impl ::protobuf::reflect::ProtobufValue for RepeatedCell { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } @@ -3572,6 +3001,406 @@ impl ::protobuf::reflect::ProtobufValue for GridId { } } +#[derive(PartialEq,Clone,Default)] +pub struct GridBlockId { + // message fields + pub value: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a GridBlockId { + fn default() -> &'a GridBlockId { + ::default_instance() + } +} + +impl GridBlockId { + pub fn new() -> GridBlockId { + ::std::default::Default::default() + } + + // string value = 1; + + + pub fn get_value(&self) -> &str { + &self.value + } + pub fn clear_value(&mut self) { + self.value.clear(); + } + + // Param is passed by value, moved + pub fn set_value(&mut self, v: ::std::string::String) { + self.value = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_value(&mut self) -> &mut ::std::string::String { + &mut self.value + } + + // Take field + pub fn take_value(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.value, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for GridBlockId { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.value)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.value.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.value); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.value.is_empty() { + os.write_string(1, &self.value)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> GridBlockId { + GridBlockId::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "value", + |m: &GridBlockId| { &m.value }, + |m: &mut GridBlockId| { &mut m.value }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "GridBlockId", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static GridBlockId { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(GridBlockId::new) + } +} + +impl ::protobuf::Clear for GridBlockId { + fn clear(&mut self) { + self.value.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for GridBlockId { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for GridBlockId { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct CreateRowPayload { + // message fields + pub grid_id: ::std::string::String, + // message oneof groups + pub one_of_start_row_id: ::std::option::Option, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a CreateRowPayload { + fn default() -> &'a CreateRowPayload { + ::default_instance() + } +} + +#[derive(Clone,PartialEq,Debug)] +pub enum CreateRowPayload_oneof_one_of_start_row_id { + start_row_id(::std::string::String), +} + +impl CreateRowPayload { + pub fn new() -> CreateRowPayload { + ::std::default::Default::default() + } + + // string grid_id = 1; + + + pub fn get_grid_id(&self) -> &str { + &self.grid_id + } + pub fn clear_grid_id(&mut self) { + self.grid_id.clear(); + } + + // Param is passed by value, moved + pub fn set_grid_id(&mut self, v: ::std::string::String) { + self.grid_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_grid_id(&mut self) -> &mut ::std::string::String { + &mut self.grid_id + } + + // Take field + pub fn take_grid_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.grid_id, ::std::string::String::new()) + } + + // string start_row_id = 2; + + + pub fn get_start_row_id(&self) -> &str { + match self.one_of_start_row_id { + ::std::option::Option::Some(CreateRowPayload_oneof_one_of_start_row_id::start_row_id(ref v)) => v, + _ => "", + } + } + pub fn clear_start_row_id(&mut self) { + self.one_of_start_row_id = ::std::option::Option::None; + } + + pub fn has_start_row_id(&self) -> bool { + match self.one_of_start_row_id { + ::std::option::Option::Some(CreateRowPayload_oneof_one_of_start_row_id::start_row_id(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_start_row_id(&mut self, v: ::std::string::String) { + self.one_of_start_row_id = ::std::option::Option::Some(CreateRowPayload_oneof_one_of_start_row_id::start_row_id(v)) + } + + // Mutable pointer to the field. + pub fn mut_start_row_id(&mut self) -> &mut ::std::string::String { + if let ::std::option::Option::Some(CreateRowPayload_oneof_one_of_start_row_id::start_row_id(_)) = self.one_of_start_row_id { + } else { + self.one_of_start_row_id = ::std::option::Option::Some(CreateRowPayload_oneof_one_of_start_row_id::start_row_id(::std::string::String::new())); + } + match self.one_of_start_row_id { + ::std::option::Option::Some(CreateRowPayload_oneof_one_of_start_row_id::start_row_id(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_start_row_id(&mut self) -> ::std::string::String { + if self.has_start_row_id() { + match self.one_of_start_row_id.take() { + ::std::option::Option::Some(CreateRowPayload_oneof_one_of_start_row_id::start_row_id(v)) => v, + _ => panic!(), + } + } else { + ::std::string::String::new() + } + } +} + +impl ::protobuf::Message for CreateRowPayload { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?; + }, + 2 => { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_start_row_id = ::std::option::Option::Some(CreateRowPayload_oneof_one_of_start_row_id::start_row_id(is.read_string()?)); + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.grid_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.grid_id); + } + if let ::std::option::Option::Some(ref v) = self.one_of_start_row_id { + match v { + &CreateRowPayload_oneof_one_of_start_row_id::start_row_id(ref v) => { + my_size += ::protobuf::rt::string_size(2, &v); + }, + }; + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.grid_id.is_empty() { + os.write_string(1, &self.grid_id)?; + } + if let ::std::option::Option::Some(ref v) = self.one_of_start_row_id { + match v { + &CreateRowPayload_oneof_one_of_start_row_id::start_row_id(ref v) => { + os.write_string(2, v)?; + }, + }; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> CreateRowPayload { + CreateRowPayload::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "grid_id", + |m: &CreateRowPayload| { &m.grid_id }, + |m: &mut CreateRowPayload| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( + "start_row_id", + CreateRowPayload::has_start_row_id, + CreateRowPayload::get_start_row_id, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "CreateRowPayload", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static CreateRowPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(CreateRowPayload::new) + } +} + +impl ::protobuf::Clear for CreateRowPayload { + fn clear(&mut self) { + self.grid_id.clear(); + self.one_of_start_row_id = ::std::option::Option::None; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for CreateRowPayload { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for CreateRowPayload { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + #[derive(PartialEq,Clone,Default)] pub struct QueryFieldPayload { // message fields @@ -3788,11 +3617,220 @@ impl ::protobuf::reflect::ProtobufValue for QueryFieldPayload { } } +#[derive(PartialEq,Clone,Default)] +pub struct QueryGridBlocksPayload { + // message fields + pub grid_id: ::std::string::String, + pub block_orders: ::protobuf::RepeatedField, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a QueryGridBlocksPayload { + fn default() -> &'a QueryGridBlocksPayload { + ::default_instance() + } +} + +impl QueryGridBlocksPayload { + pub fn new() -> QueryGridBlocksPayload { + ::std::default::Default::default() + } + + // string grid_id = 1; + + + pub fn get_grid_id(&self) -> &str { + &self.grid_id + } + pub fn clear_grid_id(&mut self) { + self.grid_id.clear(); + } + + // Param is passed by value, moved + pub fn set_grid_id(&mut self, v: ::std::string::String) { + self.grid_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_grid_id(&mut self) -> &mut ::std::string::String { + &mut self.grid_id + } + + // Take field + pub fn take_grid_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.grid_id, ::std::string::String::new()) + } + + // repeated .GridBlockOrder block_orders = 2; + + + pub fn get_block_orders(&self) -> &[GridBlockOrder] { + &self.block_orders + } + pub fn clear_block_orders(&mut self) { + self.block_orders.clear(); + } + + // Param is passed by value, moved + pub fn set_block_orders(&mut self, v: ::protobuf::RepeatedField) { + self.block_orders = v; + } + + // Mutable pointer to the field. + pub fn mut_block_orders(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.block_orders + } + + // Take field + pub fn take_block_orders(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.block_orders, ::protobuf::RepeatedField::new()) + } +} + +impl ::protobuf::Message for QueryGridBlocksPayload { + fn is_initialized(&self) -> bool { + for v in &self.block_orders { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?; + }, + 2 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.block_orders)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.grid_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.grid_id); + } + for value in &self.block_orders { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.grid_id.is_empty() { + os.write_string(1, &self.grid_id)?; + } + for v in &self.block_orders { + os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> QueryGridBlocksPayload { + QueryGridBlocksPayload::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "grid_id", + |m: &QueryGridBlocksPayload| { &m.grid_id }, + |m: &mut QueryGridBlocksPayload| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "block_orders", + |m: &QueryGridBlocksPayload| { &m.block_orders }, + |m: &mut QueryGridBlocksPayload| { &mut m.block_orders }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "QueryGridBlocksPayload", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static QueryGridBlocksPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(QueryGridBlocksPayload::new) + } +} + +impl ::protobuf::Clear for QueryGridBlocksPayload { + fn clear(&mut self) { + self.grid_id.clear(); + self.block_orders.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for QueryGridBlocksPayload { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for QueryGridBlocksPayload { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + #[derive(PartialEq,Clone,Default)] pub struct QueryRowPayload { // message fields pub grid_id: ::std::string::String, - pub row_orders: ::protobuf::SingularPtrField, + pub block_id: ::std::string::String, + pub row_id: ::std::string::String, // special fields pub unknown_fields: ::protobuf::UnknownFields, pub cached_size: ::protobuf::CachedSize, @@ -3835,47 +3873,61 @@ impl QueryRowPayload { ::std::mem::replace(&mut self.grid_id, ::std::string::String::new()) } - // .RepeatedRowOrder row_orders = 2; + // string block_id = 2; - pub fn get_row_orders(&self) -> &RepeatedRowOrder { - self.row_orders.as_ref().unwrap_or_else(|| ::default_instance()) + pub fn get_block_id(&self) -> &str { + &self.block_id } - pub fn clear_row_orders(&mut self) { - self.row_orders.clear(); - } - - pub fn has_row_orders(&self) -> bool { - self.row_orders.is_some() + pub fn clear_block_id(&mut self) { + self.block_id.clear(); } // Param is passed by value, moved - pub fn set_row_orders(&mut self, v: RepeatedRowOrder) { - self.row_orders = ::protobuf::SingularPtrField::some(v); + pub fn set_block_id(&mut self, v: ::std::string::String) { + self.block_id = v; } // Mutable pointer to the field. // If field is not initialized, it is initialized with default value first. - pub fn mut_row_orders(&mut self) -> &mut RepeatedRowOrder { - if self.row_orders.is_none() { - self.row_orders.set_default(); - } - self.row_orders.as_mut().unwrap() + pub fn mut_block_id(&mut self) -> &mut ::std::string::String { + &mut self.block_id } // Take field - pub fn take_row_orders(&mut self) -> RepeatedRowOrder { - self.row_orders.take().unwrap_or_else(|| RepeatedRowOrder::new()) + pub fn take_block_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.block_id, ::std::string::String::new()) + } + + // string row_id = 3; + + + pub fn get_row_id(&self) -> &str { + &self.row_id + } + pub fn clear_row_id(&mut self) { + self.row_id.clear(); + } + + // Param is passed by value, moved + pub fn set_row_id(&mut self, v: ::std::string::String) { + self.row_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_row_id(&mut self) -> &mut ::std::string::String { + &mut self.row_id + } + + // Take field + pub fn take_row_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.row_id, ::std::string::String::new()) } } impl ::protobuf::Message for QueryRowPayload { fn is_initialized(&self) -> bool { - for v in &self.row_orders { - if !v.is_initialized() { - return false; - } - }; true } @@ -3887,7 +3939,10 @@ impl ::protobuf::Message for QueryRowPayload { ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?; }, 2 => { - ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.row_orders)?; + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.block_id)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_id)?; }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; @@ -3904,9 +3959,11 @@ impl ::protobuf::Message for QueryRowPayload { if !self.grid_id.is_empty() { my_size += ::protobuf::rt::string_size(1, &self.grid_id); } - if let Some(ref v) = self.row_orders.as_ref() { - let len = v.compute_size(); - my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + if !self.block_id.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.block_id); + } + if !self.row_id.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.row_id); } my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); @@ -3917,10 +3974,11 @@ impl ::protobuf::Message for QueryRowPayload { if !self.grid_id.is_empty() { os.write_string(1, &self.grid_id)?; } - if let Some(ref v) = self.row_orders.as_ref() { - os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; - os.write_raw_varint32(v.get_cached_size())?; - v.write_to_with_cached_sizes(os)?; + if !self.block_id.is_empty() { + os.write_string(2, &self.block_id)?; + } + if !self.row_id.is_empty() { + os.write_string(3, &self.row_id)?; } os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) @@ -3965,10 +4023,15 @@ impl ::protobuf::Message for QueryRowPayload { |m: &QueryRowPayload| { &m.grid_id }, |m: &mut QueryRowPayload| { &mut m.grid_id }, )); - fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( - "row_orders", - |m: &QueryRowPayload| { &m.row_orders }, - |m: &mut QueryRowPayload| { &mut m.row_orders }, + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "block_id", + |m: &QueryRowPayload| { &m.block_id }, + |m: &mut QueryRowPayload| { &mut m.block_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "row_id", + |m: &QueryRowPayload| { &m.row_id }, + |m: &mut QueryRowPayload| { &mut m.row_id }, )); ::protobuf::reflect::MessageDescriptor::new_pb_name::( "QueryRowPayload", @@ -3987,7 +4050,8 @@ impl ::protobuf::Message for QueryRowPayload { impl ::protobuf::Clear for QueryRowPayload { fn clear(&mut self) { self.grid_id.clear(); - self.row_orders.clear(); + self.block_id.clear(); + self.row_id.clear(); self.unknown_fields.clear(); } } @@ -4004,116 +4068,47 @@ impl ::protobuf::reflect::ProtobufValue for QueryRowPayload { } } -#[derive(Clone,PartialEq,Eq,Debug,Hash)] -pub enum FieldType { - RichText = 0, - Number = 1, - DateTime = 2, - SingleSelect = 3, - MultiSelect = 4, - Checkbox = 5, -} - -impl ::protobuf::ProtobufEnum for FieldType { - fn value(&self) -> i32 { - *self as i32 - } - - fn from_i32(value: i32) -> ::std::option::Option { - match value { - 0 => ::std::option::Option::Some(FieldType::RichText), - 1 => ::std::option::Option::Some(FieldType::Number), - 2 => ::std::option::Option::Some(FieldType::DateTime), - 3 => ::std::option::Option::Some(FieldType::SingleSelect), - 4 => ::std::option::Option::Some(FieldType::MultiSelect), - 5 => ::std::option::Option::Some(FieldType::Checkbox), - _ => ::std::option::Option::None - } - } - - fn values() -> &'static [Self] { - static values: &'static [FieldType] = &[ - FieldType::RichText, - FieldType::Number, - FieldType::DateTime, - FieldType::SingleSelect, - FieldType::MultiSelect, - FieldType::Checkbox, - ]; - values - } - - fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - ::protobuf::reflect::EnumDescriptor::new_pb_name::("FieldType", file_descriptor_proto()) - }) - } -} - -impl ::std::marker::Copy for FieldType { -} - -impl ::std::default::Default for FieldType { - fn default() -> Self { - FieldType::RichText - } -} - -impl ::protobuf::reflect::ProtobufValue for FieldType { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) - } -} - static file_descriptor_proto_data: &'static [u8] = b"\ - \n\ngrid.proto\"\x80\x01\n\x04Grid\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\ - \x02id\x126\n\x0cfield_orders\x18\x02\x20\x01(\x0b2\x13.RepeatedFieldOrd\ - erR\x0bfieldOrders\x120\n\nrow_orders\x18\x03\x20\x01(\x0b2\x11.Repeated\ - RowOrderR\trowOrders\"G\n\nFieldOrder\x12\x19\n\x08field_id\x18\x01\x20\ - \x01(\tR\x07fieldId\x12\x1e\n\nvisibility\x18\x02\x20\x01(\x08R\nvisibil\ - ity\"7\n\x12RepeatedFieldOrder\x12!\n\x05items\x18\x01\x20\x03(\x0b2\x0b\ - .FieldOrderR\x05items\"\xc5\x01\n\x05Field\x12\x0e\n\x02id\x18\x01\x20\ - \x01(\tR\x02id\x12\x12\n\x04name\x18\x02\x20\x01(\tR\x04name\x12\x12\n\ - \x04desc\x18\x03\x20\x01(\tR\x04desc\x12)\n\nfield_type\x18\x04\x20\x01(\ - \x0e2\n.FieldTypeR\tfieldType\x12\x16\n\x06frozen\x18\x05\x20\x01(\x08R\ - \x06frozen\x12\x14\n\x05width\x18\x06\x20\x01(\x05R\x05width\x12+\n\x0ct\ - ype_options\x18\x07\x20\x01(\x0b2\x08.AnyDataR\x0btypeOptions\"-\n\rRepe\ - atedField\x12\x1c\n\x05items\x18\x01\x20\x03(\x0b2\x06.FieldR\x05items\"\ - 8\n\x07AnyData\x12\x17\n\x07type_id\x18\x01\x20\x01(\tR\x06typeId\x12\ - \x14\n\x05value\x18\x02\x20\x01(\x0cR\x05value\"Z\n\x08RowOrder\x12\x17\ - \n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x12\x15\n\x06row_id\x18\x02\ - \x20\x01(\tR\x05rowId\x12\x1e\n\nvisibility\x18\x03\x20\x01(\x08R\nvisib\ - ility\"3\n\x10RepeatedRowOrder\x12\x1f\n\x05items\x18\x01\x20\x03(\x0b2\ - \t.RowOrderR\x05items\"\xc2\x01\n\x06RawRow\x12\x0e\n\x02id\x18\x01\x20\ - \x01(\tR\x02id\x12\x17\n\x07grid_id\x18\x02\x20\x01(\tR\x06gridId\x12C\n\ - \x10cell_by_field_id\x18\x03\x20\x03(\x0b2\x1a.RawRow.CellByFieldIdEntry\ - R\rcellByFieldId\x1aJ\n\x12CellByFieldIdEntry\x12\x10\n\x03key\x18\x01\ - \x20\x01(\tR\x03key\x12\x1e\n\x05value\x18\x02\x20\x01(\x0b2\x08.RawCell\ - R\x05value:\x028\x01\"i\n\x07RawCell\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\ - \x02id\x12\x15\n\x06row_id\x18\x02\x20\x01(\tR\x05rowId\x12\x19\n\x08fie\ - ld_id\x18\x03\x20\x01(\tR\x07fieldId\x12\x1c\n\x04data\x18\x04\x20\x01(\ - \x0b2\x08.AnyDataR\x04data\")\n\x0bRepeatedRow\x12\x1a\n\x05items\x18\ - \x01\x20\x03(\x0b2\x04.RowR\x05items\"\xa0\x01\n\x03Row\x12\x0e\n\x02id\ + \n\ngrid.proto\x1a\nmeta.proto\"z\n\x04Grid\x12\x0e\n\x02id\x18\x01\x20\ + \x01(\tR\x02id\x12.\n\x0cfield_orders\x18\x02\x20\x03(\x0b2\x0b.FieldOrd\ + erR\x0bfieldOrders\x122\n\x0cblock_orders\x18\x03\x20\x03(\x0b2\x0f.Grid\ + BlockOrderR\x0bblockOrders\"\xb8\x01\n\x05Field\x12\x0e\n\x02id\x18\x01\ + \x20\x01(\tR\x02id\x12\x12\n\x04name\x18\x02\x20\x01(\tR\x04name\x12\x12\ + \n\x04desc\x18\x03\x20\x01(\tR\x04desc\x12)\n\nfield_type\x18\x04\x20\ + \x01(\x0e2\n.FieldTypeR\tfieldType\x12\x16\n\x06frozen\x18\x05\x20\x01(\ + \x08R\x06frozen\x12\x1e\n\nvisibility\x18\x06\x20\x01(\x08R\nvisibility\ + \x12\x14\n\x05width\x18\x07\x20\x01(\x05R\x05width\"'\n\nFieldOrder\x12\ + \x19\n\x08field_id\x18\x01\x20\x01(\tR\x07fieldId\"-\n\rRepeatedField\ + \x12\x1c\n\x05items\x18\x01\x20\x03(\x0b2\x06.FieldR\x05items\"7\n\x12Re\ + peatedFieldOrder\x12!\n\x05items\x18\x01\x20\x03(\x0b2\x0b.FieldOrderR\ + \x05items\"T\n\x08RowOrder\x12\x15\n\x06row_id\x18\x01\x20\x01(\tR\x05ro\ + wId\x12\x19\n\x08block_id\x18\x02\x20\x01(\tR\x07blockId\x12\x16\n\x06he\ + ight\x18\x03\x20\x01(\x05R\x06height\"\xb8\x01\n\x03Row\x12\x0e\n\x02id\ \x18\x01\x20\x01(\tR\x02id\x12@\n\x10cell_by_field_id\x18\x02\x20\x03(\ - \x0b2\x17.Row.CellByFieldIdEntryR\rcellByFieldId\x1aG\n\x12CellByFieldId\ - Entry\x12\x10\n\x03key\x18\x01\x20\x01(\tR\x03key\x12\x1b\n\x05value\x18\ - \x02\x20\x01(\x0b2\x05.CellR\x05value:\x028\x01\"K\n\x04Cell\x12\x0e\n\ - \x02id\x18\x01\x20\x01(\tR\x02id\x12\x19\n\x08field_id\x18\x02\x20\x01(\ - \tR\x07fieldId\x12\x18\n\x07content\x18\x03\x20\x01(\tR\x07content\"e\n\ - \rCellChangeset\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12\x15\n\x06r\ - ow_id\x18\x02\x20\x01(\tR\x05rowId\x12\x19\n\x08field_id\x18\x03\x20\x01\ - (\tR\x07fieldId\x12\x12\n\x04data\x18\x04\x20\x01(\tR\x04data\"'\n\x11Cr\ - eateGridPayload\x12\x12\n\x04name\x18\x01\x20\x01(\tR\x04name\"\x1e\n\ - \x06GridId\x12\x14\n\x05value\x18\x01\x20\x01(\tR\x05value\"d\n\x11Query\ - FieldPayload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x126\n\ - \x0cfield_orders\x18\x02\x20\x01(\x0b2\x13.RepeatedFieldOrderR\x0bfieldO\ - rders\"\\\n\x0fQueryRowPayload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\ - \x06gridId\x120\n\nrow_orders\x18\x02\x20\x01(\x0b2\x11.RepeatedRowOrder\ - R\trowOrders*d\n\tFieldType\x12\x0c\n\x08RichText\x10\0\x12\n\n\x06Numbe\ - r\x10\x01\x12\x0c\n\x08DateTime\x10\x02\x12\x10\n\x0cSingleSelect\x10\ - \x03\x12\x0f\n\x0bMultiSelect\x10\x04\x12\x0c\n\x08Checkbox\x10\x05b\x06\ - proto3\ + \x0b2\x17.Row.CellByFieldIdEntryR\rcellByFieldId\x12\x16\n\x06height\x18\ + \x03\x20\x01(\x05R\x06height\x1aG\n\x12CellByFieldIdEntry\x12\x10\n\x03k\ + ey\x18\x01\x20\x01(\tR\x03key\x12\x1b\n\x05value\x18\x02\x20\x01(\x0b2\ + \x05.CellR\x05value:\x028\x01\")\n\x0bRepeatedRow\x12\x1a\n\x05items\x18\ + \x01\x20\x03(\x0b2\x04.RowR\x05items\"5\n\x11RepeatedGridBlock\x12\x20\n\ + \x05items\x18\x01\x20\x03(\x0b2\n.GridBlockR\x05items\"+\n\x0eGridBlockO\ + rder\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\"P\n\tGridBloc\ + k\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12(\n\nrow_order\ + s\x18\x02\x20\x03(\x0b2\t.RowOrderR\trowOrders\";\n\x04Cell\x12\x19\n\ + \x08field_id\x18\x01\x20\x01(\tR\x07fieldId\x12\x18\n\x07content\x18\x02\ + \x20\x01(\tR\x07content\"+\n\x0cRepeatedCell\x12\x1b\n\x05items\x18\x01\ + \x20\x03(\x0b2\x05.CellR\x05items\"'\n\x11CreateGridPayload\x12\x12\n\ + \x04name\x18\x01\x20\x01(\tR\x04name\"\x1e\n\x06GridId\x12\x14\n\x05valu\ + e\x18\x01\x20\x01(\tR\x05value\"#\n\x0bGridBlockId\x12\x14\n\x05value\ + \x18\x01\x20\x01(\tR\x05value\"f\n\x10CreateRowPayload\x12\x17\n\x07grid\ + _id\x18\x01\x20\x01(\tR\x06gridId\x12\"\n\x0cstart_row_id\x18\x02\x20\ + \x01(\tH\0R\nstartRowIdB\x15\n\x13one_of_start_row_id\"d\n\x11QueryField\ + Payload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x126\n\x0cfie\ + ld_orders\x18\x02\x20\x01(\x0b2\x13.RepeatedFieldOrderR\x0bfieldOrders\"\ + e\n\x16QueryGridBlocksPayload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\ + \x06gridId\x122\n\x0cblock_orders\x18\x02\x20\x03(\x0b2\x0f.GridBlockOrd\ + erR\x0bblockOrders\"\\\n\x0fQueryRowPayload\x12\x17\n\x07grid_id\x18\x01\ + \x20\x01(\tR\x06gridId\x12\x19\n\x08block_id\x18\x02\x20\x01(\tR\x07bloc\ + kId\x12\x15\n\x06row_id\x18\x03\x20\x01(\tR\x05rowIdb\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/shared-lib/flowy-grid-data-model/src/protobuf/model/meta.rs b/shared-lib/flowy-grid-data-model/src/protobuf/model/meta.rs new file mode 100644 index 0000000000..2e27686c00 --- /dev/null +++ b/shared-lib/flowy-grid-data-model/src/protobuf/model/meta.rs @@ -0,0 +1,3523 @@ +// This file is generated by rust-protobuf 2.25.2. Do not edit +// @generated + +// https://github.com/rust-lang/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(unused_attributes)] +#![cfg_attr(rustfmt, rustfmt::skip)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unused_imports)] +#![allow(unused_results)] +//! Generated file from `meta.proto` + +/// Generated files are compatible only with the same version +/// of protobuf runtime. +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_25_2; + +#[derive(PartialEq,Clone,Default)] +pub struct GridMeta { + // message fields + pub grid_id: ::std::string::String, + pub fields: ::protobuf::RepeatedField, + pub block_metas: ::protobuf::RepeatedField, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a GridMeta { + fn default() -> &'a GridMeta { + ::default_instance() + } +} + +impl GridMeta { + pub fn new() -> GridMeta { + ::std::default::Default::default() + } + + // string grid_id = 1; + + + pub fn get_grid_id(&self) -> &str { + &self.grid_id + } + pub fn clear_grid_id(&mut self) { + self.grid_id.clear(); + } + + // Param is passed by value, moved + pub fn set_grid_id(&mut self, v: ::std::string::String) { + self.grid_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_grid_id(&mut self) -> &mut ::std::string::String { + &mut self.grid_id + } + + // Take field + pub fn take_grid_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.grid_id, ::std::string::String::new()) + } + + // repeated .FieldMeta fields = 2; + + + pub fn get_fields(&self) -> &[FieldMeta] { + &self.fields + } + pub fn clear_fields(&mut self) { + self.fields.clear(); + } + + // Param is passed by value, moved + pub fn set_fields(&mut self, v: ::protobuf::RepeatedField) { + self.fields = v; + } + + // Mutable pointer to the field. + pub fn mut_fields(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.fields + } + + // Take field + pub fn take_fields(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.fields, ::protobuf::RepeatedField::new()) + } + + // repeated .GridBlockMeta block_metas = 3; + + + pub fn get_block_metas(&self) -> &[GridBlockMeta] { + &self.block_metas + } + pub fn clear_block_metas(&mut self) { + self.block_metas.clear(); + } + + // Param is passed by value, moved + pub fn set_block_metas(&mut self, v: ::protobuf::RepeatedField) { + self.block_metas = v; + } + + // Mutable pointer to the field. + pub fn mut_block_metas(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.block_metas + } + + // Take field + pub fn take_block_metas(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.block_metas, ::protobuf::RepeatedField::new()) + } +} + +impl ::protobuf::Message for GridMeta { + fn is_initialized(&self) -> bool { + for v in &self.fields { + if !v.is_initialized() { + return false; + } + }; + for v in &self.block_metas { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?; + }, + 2 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.fields)?; + }, + 3 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.block_metas)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.grid_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.grid_id); + } + for value in &self.fields { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + for value in &self.block_metas { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.grid_id.is_empty() { + os.write_string(1, &self.grid_id)?; + } + for v in &self.fields { + os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + for v in &self.block_metas { + os.write_tag(3, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> GridMeta { + GridMeta::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "grid_id", + |m: &GridMeta| { &m.grid_id }, + |m: &mut GridMeta| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "fields", + |m: &GridMeta| { &m.fields }, + |m: &mut GridMeta| { &mut m.fields }, + )); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "block_metas", + |m: &GridMeta| { &m.block_metas }, + |m: &mut GridMeta| { &mut m.block_metas }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "GridMeta", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static GridMeta { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(GridMeta::new) + } +} + +impl ::protobuf::Clear for GridMeta { + fn clear(&mut self) { + self.grid_id.clear(); + self.fields.clear(); + self.block_metas.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for GridMeta { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for GridMeta { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct GridBlockMeta { + // message fields + pub block_id: ::std::string::String, + pub start_row_index: i32, + pub row_count: i32, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a GridBlockMeta { + fn default() -> &'a GridBlockMeta { + ::default_instance() + } +} + +impl GridBlockMeta { + pub fn new() -> GridBlockMeta { + ::std::default::Default::default() + } + + // string block_id = 1; + + + pub fn get_block_id(&self) -> &str { + &self.block_id + } + pub fn clear_block_id(&mut self) { + self.block_id.clear(); + } + + // Param is passed by value, moved + pub fn set_block_id(&mut self, v: ::std::string::String) { + self.block_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_block_id(&mut self) -> &mut ::std::string::String { + &mut self.block_id + } + + // Take field + pub fn take_block_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.block_id, ::std::string::String::new()) + } + + // int32 start_row_index = 2; + + + pub fn get_start_row_index(&self) -> i32 { + self.start_row_index + } + pub fn clear_start_row_index(&mut self) { + self.start_row_index = 0; + } + + // Param is passed by value, moved + pub fn set_start_row_index(&mut self, v: i32) { + self.start_row_index = v; + } + + // int32 row_count = 3; + + + pub fn get_row_count(&self) -> i32 { + self.row_count + } + pub fn clear_row_count(&mut self) { + self.row_count = 0; + } + + // Param is passed by value, moved + pub fn set_row_count(&mut self, v: i32) { + self.row_count = v; + } +} + +impl ::protobuf::Message for GridBlockMeta { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.block_id)?; + }, + 2 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_int32()?; + self.start_row_index = tmp; + }, + 3 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_int32()?; + self.row_count = tmp; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.block_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.block_id); + } + if self.start_row_index != 0 { + my_size += ::protobuf::rt::value_size(2, self.start_row_index, ::protobuf::wire_format::WireTypeVarint); + } + if self.row_count != 0 { + my_size += ::protobuf::rt::value_size(3, self.row_count, ::protobuf::wire_format::WireTypeVarint); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.block_id.is_empty() { + os.write_string(1, &self.block_id)?; + } + if self.start_row_index != 0 { + os.write_int32(2, self.start_row_index)?; + } + if self.row_count != 0 { + os.write_int32(3, self.row_count)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> GridBlockMeta { + GridBlockMeta::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "block_id", + |m: &GridBlockMeta| { &m.block_id }, + |m: &mut GridBlockMeta| { &mut m.block_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>( + "start_row_index", + |m: &GridBlockMeta| { &m.start_row_index }, + |m: &mut GridBlockMeta| { &mut m.start_row_index }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>( + "row_count", + |m: &GridBlockMeta| { &m.row_count }, + |m: &mut GridBlockMeta| { &mut m.row_count }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "GridBlockMeta", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static GridBlockMeta { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(GridBlockMeta::new) + } +} + +impl ::protobuf::Clear for GridBlockMeta { + fn clear(&mut self) { + self.block_id.clear(); + self.start_row_index = 0; + self.row_count = 0; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for GridBlockMeta { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for GridBlockMeta { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct GridBlockMetaSerde { + // message fields + pub block_id: ::std::string::String, + pub row_metas: ::protobuf::RepeatedField, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a GridBlockMetaSerde { + fn default() -> &'a GridBlockMetaSerde { + ::default_instance() + } +} + +impl GridBlockMetaSerde { + pub fn new() -> GridBlockMetaSerde { + ::std::default::Default::default() + } + + // string block_id = 1; + + + pub fn get_block_id(&self) -> &str { + &self.block_id + } + pub fn clear_block_id(&mut self) { + self.block_id.clear(); + } + + // Param is passed by value, moved + pub fn set_block_id(&mut self, v: ::std::string::String) { + self.block_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_block_id(&mut self) -> &mut ::std::string::String { + &mut self.block_id + } + + // Take field + pub fn take_block_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.block_id, ::std::string::String::new()) + } + + // repeated .RowMeta row_metas = 2; + + + pub fn get_row_metas(&self) -> &[RowMeta] { + &self.row_metas + } + pub fn clear_row_metas(&mut self) { + self.row_metas.clear(); + } + + // Param is passed by value, moved + pub fn set_row_metas(&mut self, v: ::protobuf::RepeatedField) { + self.row_metas = v; + } + + // Mutable pointer to the field. + pub fn mut_row_metas(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.row_metas + } + + // Take field + pub fn take_row_metas(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.row_metas, ::protobuf::RepeatedField::new()) + } +} + +impl ::protobuf::Message for GridBlockMetaSerde { + fn is_initialized(&self) -> bool { + for v in &self.row_metas { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.block_id)?; + }, + 2 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.row_metas)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.block_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.block_id); + } + for value in &self.row_metas { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.block_id.is_empty() { + os.write_string(1, &self.block_id)?; + } + for v in &self.row_metas { + os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> GridBlockMetaSerde { + GridBlockMetaSerde::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "block_id", + |m: &GridBlockMetaSerde| { &m.block_id }, + |m: &mut GridBlockMetaSerde| { &mut m.block_id }, + )); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "row_metas", + |m: &GridBlockMetaSerde| { &m.row_metas }, + |m: &mut GridBlockMetaSerde| { &mut m.row_metas }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "GridBlockMetaSerde", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static GridBlockMetaSerde { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(GridBlockMetaSerde::new) + } +} + +impl ::protobuf::Clear for GridBlockMetaSerde { + fn clear(&mut self) { + self.block_id.clear(); + self.row_metas.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for GridBlockMetaSerde { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for GridBlockMetaSerde { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct FieldMeta { + // message fields + pub id: ::std::string::String, + pub name: ::std::string::String, + pub desc: ::std::string::String, + pub field_type: FieldType, + pub frozen: bool, + pub visibility: bool, + pub width: i32, + pub type_options: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a FieldMeta { + fn default() -> &'a FieldMeta { + ::default_instance() + } +} + +impl FieldMeta { + pub fn new() -> FieldMeta { + ::std::default::Default::default() + } + + // string id = 1; + + + pub fn get_id(&self) -> &str { + &self.id + } + pub fn clear_id(&mut self) { + self.id.clear(); + } + + // Param is passed by value, moved + pub fn set_id(&mut self, v: ::std::string::String) { + self.id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_id(&mut self) -> &mut ::std::string::String { + &mut self.id + } + + // Take field + pub fn take_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.id, ::std::string::String::new()) + } + + // string name = 2; + + + pub fn get_name(&self) -> &str { + &self.name + } + pub fn clear_name(&mut self) { + self.name.clear(); + } + + // Param is passed by value, moved + pub fn set_name(&mut self, v: ::std::string::String) { + self.name = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_name(&mut self) -> &mut ::std::string::String { + &mut self.name + } + + // Take field + pub fn take_name(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.name, ::std::string::String::new()) + } + + // string desc = 3; + + + pub fn get_desc(&self) -> &str { + &self.desc + } + pub fn clear_desc(&mut self) { + self.desc.clear(); + } + + // Param is passed by value, moved + pub fn set_desc(&mut self, v: ::std::string::String) { + self.desc = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_desc(&mut self) -> &mut ::std::string::String { + &mut self.desc + } + + // Take field + pub fn take_desc(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.desc, ::std::string::String::new()) + } + + // .FieldType field_type = 4; + + + pub fn get_field_type(&self) -> FieldType { + self.field_type + } + pub fn clear_field_type(&mut self) { + self.field_type = FieldType::RichText; + } + + // Param is passed by value, moved + pub fn set_field_type(&mut self, v: FieldType) { + self.field_type = v; + } + + // bool frozen = 5; + + + pub fn get_frozen(&self) -> bool { + self.frozen + } + pub fn clear_frozen(&mut self) { + self.frozen = false; + } + + // Param is passed by value, moved + pub fn set_frozen(&mut self, v: bool) { + self.frozen = v; + } + + // bool visibility = 6; + + + pub fn get_visibility(&self) -> bool { + self.visibility + } + pub fn clear_visibility(&mut self) { + self.visibility = false; + } + + // Param is passed by value, moved + pub fn set_visibility(&mut self, v: bool) { + self.visibility = v; + } + + // int32 width = 7; + + + pub fn get_width(&self) -> i32 { + self.width + } + pub fn clear_width(&mut self) { + self.width = 0; + } + + // Param is passed by value, moved + pub fn set_width(&mut self, v: i32) { + self.width = v; + } + + // string type_options = 8; + + + pub fn get_type_options(&self) -> &str { + &self.type_options + } + pub fn clear_type_options(&mut self) { + self.type_options.clear(); + } + + // Param is passed by value, moved + pub fn set_type_options(&mut self, v: ::std::string::String) { + self.type_options = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_type_options(&mut self) -> &mut ::std::string::String { + &mut self.type_options + } + + // Take field + pub fn take_type_options(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.type_options, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for FieldMeta { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.desc)?; + }, + 4 => { + ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.field_type, 4, &mut self.unknown_fields)? + }, + 5 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_bool()?; + self.frozen = tmp; + }, + 6 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_bool()?; + self.visibility = tmp; + }, + 7 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_int32()?; + self.width = tmp; + }, + 8 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.type_options)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.id); + } + if !self.name.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.name); + } + if !self.desc.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.desc); + } + if self.field_type != FieldType::RichText { + my_size += ::protobuf::rt::enum_size(4, self.field_type); + } + if self.frozen != false { + my_size += 2; + } + if self.visibility != false { + my_size += 2; + } + if self.width != 0 { + my_size += ::protobuf::rt::value_size(7, self.width, ::protobuf::wire_format::WireTypeVarint); + } + if !self.type_options.is_empty() { + my_size += ::protobuf::rt::string_size(8, &self.type_options); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.id.is_empty() { + os.write_string(1, &self.id)?; + } + if !self.name.is_empty() { + os.write_string(2, &self.name)?; + } + if !self.desc.is_empty() { + os.write_string(3, &self.desc)?; + } + if self.field_type != FieldType::RichText { + os.write_enum(4, ::protobuf::ProtobufEnum::value(&self.field_type))?; + } + if self.frozen != false { + os.write_bool(5, self.frozen)?; + } + if self.visibility != false { + os.write_bool(6, self.visibility)?; + } + if self.width != 0 { + os.write_int32(7, self.width)?; + } + if !self.type_options.is_empty() { + os.write_string(8, &self.type_options)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> FieldMeta { + FieldMeta::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "id", + |m: &FieldMeta| { &m.id }, + |m: &mut FieldMeta| { &mut m.id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "name", + |m: &FieldMeta| { &m.name }, + |m: &mut FieldMeta| { &mut m.name }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "desc", + |m: &FieldMeta| { &m.desc }, + |m: &mut FieldMeta| { &mut m.desc }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( + "field_type", + |m: &FieldMeta| { &m.field_type }, + |m: &mut FieldMeta| { &mut m.field_type }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( + "frozen", + |m: &FieldMeta| { &m.frozen }, + |m: &mut FieldMeta| { &mut m.frozen }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( + "visibility", + |m: &FieldMeta| { &m.visibility }, + |m: &mut FieldMeta| { &mut m.visibility }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>( + "width", + |m: &FieldMeta| { &m.width }, + |m: &mut FieldMeta| { &mut m.width }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "type_options", + |m: &FieldMeta| { &m.type_options }, + |m: &mut FieldMeta| { &mut m.type_options }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "FieldMeta", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static FieldMeta { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(FieldMeta::new) + } +} + +impl ::protobuf::Clear for FieldMeta { + fn clear(&mut self) { + self.id.clear(); + self.name.clear(); + self.desc.clear(); + self.field_type = FieldType::RichText; + self.frozen = false; + self.visibility = false; + self.width = 0; + self.type_options.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for FieldMeta { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for FieldMeta { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct FieldChangeset { + // message fields + pub field_id: ::std::string::String, + // message oneof groups + pub one_of_name: ::std::option::Option, + pub one_of_desc: ::std::option::Option, + pub one_of_field_type: ::std::option::Option, + pub one_of_frozen: ::std::option::Option, + pub one_of_visibility: ::std::option::Option, + pub one_of_width: ::std::option::Option, + pub one_of_type_options: ::std::option::Option, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a FieldChangeset { + fn default() -> &'a FieldChangeset { + ::default_instance() + } +} + +#[derive(Clone,PartialEq,Debug)] +pub enum FieldChangeset_oneof_one_of_name { + name(::std::string::String), +} + +#[derive(Clone,PartialEq,Debug)] +pub enum FieldChangeset_oneof_one_of_desc { + desc(::std::string::String), +} + +#[derive(Clone,PartialEq,Debug)] +pub enum FieldChangeset_oneof_one_of_field_type { + field_type(FieldType), +} + +#[derive(Clone,PartialEq,Debug)] +pub enum FieldChangeset_oneof_one_of_frozen { + frozen(bool), +} + +#[derive(Clone,PartialEq,Debug)] +pub enum FieldChangeset_oneof_one_of_visibility { + visibility(bool), +} + +#[derive(Clone,PartialEq,Debug)] +pub enum FieldChangeset_oneof_one_of_width { + width(i32), +} + +#[derive(Clone,PartialEq,Debug)] +pub enum FieldChangeset_oneof_one_of_type_options { + type_options(::std::string::String), +} + +impl FieldChangeset { + pub fn new() -> FieldChangeset { + ::std::default::Default::default() + } + + // string field_id = 1; + + + pub fn get_field_id(&self) -> &str { + &self.field_id + } + pub fn clear_field_id(&mut self) { + self.field_id.clear(); + } + + // Param is passed by value, moved + pub fn set_field_id(&mut self, v: ::std::string::String) { + self.field_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_field_id(&mut self) -> &mut ::std::string::String { + &mut self.field_id + } + + // Take field + pub fn take_field_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.field_id, ::std::string::String::new()) + } + + // string name = 2; + + + pub fn get_name(&self) -> &str { + match self.one_of_name { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_name::name(ref v)) => v, + _ => "", + } + } + pub fn clear_name(&mut self) { + self.one_of_name = ::std::option::Option::None; + } + + pub fn has_name(&self) -> bool { + match self.one_of_name { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_name::name(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_name(&mut self, v: ::std::string::String) { + self.one_of_name = ::std::option::Option::Some(FieldChangeset_oneof_one_of_name::name(v)) + } + + // Mutable pointer to the field. + pub fn mut_name(&mut self) -> &mut ::std::string::String { + if let ::std::option::Option::Some(FieldChangeset_oneof_one_of_name::name(_)) = self.one_of_name { + } else { + self.one_of_name = ::std::option::Option::Some(FieldChangeset_oneof_one_of_name::name(::std::string::String::new())); + } + match self.one_of_name { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_name::name(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_name(&mut self) -> ::std::string::String { + if self.has_name() { + match self.one_of_name.take() { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_name::name(v)) => v, + _ => panic!(), + } + } else { + ::std::string::String::new() + } + } + + // string desc = 3; + + + pub fn get_desc(&self) -> &str { + match self.one_of_desc { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(ref v)) => v, + _ => "", + } + } + pub fn clear_desc(&mut self) { + self.one_of_desc = ::std::option::Option::None; + } + + pub fn has_desc(&self) -> bool { + match self.one_of_desc { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_desc(&mut self, v: ::std::string::String) { + self.one_of_desc = ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(v)) + } + + // Mutable pointer to the field. + pub fn mut_desc(&mut self) -> &mut ::std::string::String { + if let ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(_)) = self.one_of_desc { + } else { + self.one_of_desc = ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(::std::string::String::new())); + } + match self.one_of_desc { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_desc(&mut self) -> ::std::string::String { + if self.has_desc() { + match self.one_of_desc.take() { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(v)) => v, + _ => panic!(), + } + } else { + ::std::string::String::new() + } + } + + // .FieldType field_type = 4; + + + pub fn get_field_type(&self) -> FieldType { + match self.one_of_field_type { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_field_type::field_type(v)) => v, + _ => FieldType::RichText, + } + } + pub fn clear_field_type(&mut self) { + self.one_of_field_type = ::std::option::Option::None; + } + + pub fn has_field_type(&self) -> bool { + match self.one_of_field_type { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_field_type::field_type(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_field_type(&mut self, v: FieldType) { + self.one_of_field_type = ::std::option::Option::Some(FieldChangeset_oneof_one_of_field_type::field_type(v)) + } + + // bool frozen = 5; + + + pub fn get_frozen(&self) -> bool { + match self.one_of_frozen { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_frozen::frozen(v)) => v, + _ => false, + } + } + pub fn clear_frozen(&mut self) { + self.one_of_frozen = ::std::option::Option::None; + } + + pub fn has_frozen(&self) -> bool { + match self.one_of_frozen { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_frozen::frozen(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_frozen(&mut self, v: bool) { + self.one_of_frozen = ::std::option::Option::Some(FieldChangeset_oneof_one_of_frozen::frozen(v)) + } + + // bool visibility = 6; + + + pub fn get_visibility(&self) -> bool { + match self.one_of_visibility { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_visibility::visibility(v)) => v, + _ => false, + } + } + pub fn clear_visibility(&mut self) { + self.one_of_visibility = ::std::option::Option::None; + } + + pub fn has_visibility(&self) -> bool { + match self.one_of_visibility { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_visibility::visibility(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_visibility(&mut self, v: bool) { + self.one_of_visibility = ::std::option::Option::Some(FieldChangeset_oneof_one_of_visibility::visibility(v)) + } + + // int32 width = 7; + + + pub fn get_width(&self) -> i32 { + match self.one_of_width { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_width::width(v)) => v, + _ => 0, + } + } + pub fn clear_width(&mut self) { + self.one_of_width = ::std::option::Option::None; + } + + pub fn has_width(&self) -> bool { + match self.one_of_width { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_width::width(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_width(&mut self, v: i32) { + self.one_of_width = ::std::option::Option::Some(FieldChangeset_oneof_one_of_width::width(v)) + } + + // string type_options = 8; + + + pub fn get_type_options(&self) -> &str { + match self.one_of_type_options { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(ref v)) => v, + _ => "", + } + } + pub fn clear_type_options(&mut self) { + self.one_of_type_options = ::std::option::Option::None; + } + + pub fn has_type_options(&self) -> bool { + match self.one_of_type_options { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_type_options(&mut self, v: ::std::string::String) { + self.one_of_type_options = ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(v)) + } + + // Mutable pointer to the field. + pub fn mut_type_options(&mut self) -> &mut ::std::string::String { + if let ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(_)) = self.one_of_type_options { + } else { + self.one_of_type_options = ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(::std::string::String::new())); + } + match self.one_of_type_options { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_type_options(&mut self) -> ::std::string::String { + if self.has_type_options() { + match self.one_of_type_options.take() { + ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(v)) => v, + _ => panic!(), + } + } else { + ::std::string::String::new() + } + } +} + +impl ::protobuf::Message for FieldChangeset { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?; + }, + 2 => { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_name = ::std::option::Option::Some(FieldChangeset_oneof_one_of_name::name(is.read_string()?)); + }, + 3 => { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_desc = ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(is.read_string()?)); + }, + 4 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_field_type = ::std::option::Option::Some(FieldChangeset_oneof_one_of_field_type::field_type(is.read_enum()?)); + }, + 5 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_frozen = ::std::option::Option::Some(FieldChangeset_oneof_one_of_frozen::frozen(is.read_bool()?)); + }, + 6 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_visibility = ::std::option::Option::Some(FieldChangeset_oneof_one_of_visibility::visibility(is.read_bool()?)); + }, + 7 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_width = ::std::option::Option::Some(FieldChangeset_oneof_one_of_width::width(is.read_int32()?)); + }, + 8 => { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_type_options = ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(is.read_string()?)); + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.field_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.field_id); + } + if let ::std::option::Option::Some(ref v) = self.one_of_name { + match v { + &FieldChangeset_oneof_one_of_name::name(ref v) => { + my_size += ::protobuf::rt::string_size(2, &v); + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_desc { + match v { + &FieldChangeset_oneof_one_of_desc::desc(ref v) => { + my_size += ::protobuf::rt::string_size(3, &v); + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_field_type { + match v { + &FieldChangeset_oneof_one_of_field_type::field_type(v) => { + my_size += ::protobuf::rt::enum_size(4, v); + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_frozen { + match v { + &FieldChangeset_oneof_one_of_frozen::frozen(v) => { + my_size += 2; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_visibility { + match v { + &FieldChangeset_oneof_one_of_visibility::visibility(v) => { + my_size += 2; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_width { + match v { + &FieldChangeset_oneof_one_of_width::width(v) => { + my_size += ::protobuf::rt::value_size(7, v, ::protobuf::wire_format::WireTypeVarint); + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_type_options { + match v { + &FieldChangeset_oneof_one_of_type_options::type_options(ref v) => { + my_size += ::protobuf::rt::string_size(8, &v); + }, + }; + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.field_id.is_empty() { + os.write_string(1, &self.field_id)?; + } + if let ::std::option::Option::Some(ref v) = self.one_of_name { + match v { + &FieldChangeset_oneof_one_of_name::name(ref v) => { + os.write_string(2, v)?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_desc { + match v { + &FieldChangeset_oneof_one_of_desc::desc(ref v) => { + os.write_string(3, v)?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_field_type { + match v { + &FieldChangeset_oneof_one_of_field_type::field_type(v) => { + os.write_enum(4, ::protobuf::ProtobufEnum::value(&v))?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_frozen { + match v { + &FieldChangeset_oneof_one_of_frozen::frozen(v) => { + os.write_bool(5, v)?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_visibility { + match v { + &FieldChangeset_oneof_one_of_visibility::visibility(v) => { + os.write_bool(6, v)?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_width { + match v { + &FieldChangeset_oneof_one_of_width::width(v) => { + os.write_int32(7, v)?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_type_options { + match v { + &FieldChangeset_oneof_one_of_type_options::type_options(ref v) => { + os.write_string(8, v)?; + }, + }; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> FieldChangeset { + FieldChangeset::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "field_id", + |m: &FieldChangeset| { &m.field_id }, + |m: &mut FieldChangeset| { &mut m.field_id }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( + "name", + FieldChangeset::has_name, + FieldChangeset::get_name, + )); + fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( + "desc", + FieldChangeset::has_desc, + FieldChangeset::get_desc, + )); + fields.push(::protobuf::reflect::accessor::make_singular_enum_accessor::<_, FieldType>( + "field_type", + FieldChangeset::has_field_type, + FieldChangeset::get_field_type, + )); + fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>( + "frozen", + FieldChangeset::has_frozen, + FieldChangeset::get_frozen, + )); + fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>( + "visibility", + FieldChangeset::has_visibility, + FieldChangeset::get_visibility, + )); + fields.push(::protobuf::reflect::accessor::make_singular_i32_accessor::<_>( + "width", + FieldChangeset::has_width, + FieldChangeset::get_width, + )); + fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( + "type_options", + FieldChangeset::has_type_options, + FieldChangeset::get_type_options, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "FieldChangeset", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static FieldChangeset { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(FieldChangeset::new) + } +} + +impl ::protobuf::Clear for FieldChangeset { + fn clear(&mut self) { + self.field_id.clear(); + self.one_of_name = ::std::option::Option::None; + self.one_of_desc = ::std::option::Option::None; + self.one_of_field_type = ::std::option::Option::None; + self.one_of_frozen = ::std::option::Option::None; + self.one_of_visibility = ::std::option::Option::None; + self.one_of_width = ::std::option::Option::None; + self.one_of_type_options = ::std::option::Option::None; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for FieldChangeset { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for FieldChangeset { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct AnyData { + // message fields + pub type_id: ::std::string::String, + pub value: ::std::vec::Vec, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a AnyData { + fn default() -> &'a AnyData { + ::default_instance() + } +} + +impl AnyData { + pub fn new() -> AnyData { + ::std::default::Default::default() + } + + // string type_id = 1; + + + pub fn get_type_id(&self) -> &str { + &self.type_id + } + pub fn clear_type_id(&mut self) { + self.type_id.clear(); + } + + // Param is passed by value, moved + pub fn set_type_id(&mut self, v: ::std::string::String) { + self.type_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_type_id(&mut self) -> &mut ::std::string::String { + &mut self.type_id + } + + // Take field + pub fn take_type_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.type_id, ::std::string::String::new()) + } + + // bytes value = 2; + + + pub fn get_value(&self) -> &[u8] { + &self.value + } + pub fn clear_value(&mut self) { + self.value.clear(); + } + + // Param is passed by value, moved + pub fn set_value(&mut self, v: ::std::vec::Vec) { + self.value = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_value(&mut self) -> &mut ::std::vec::Vec { + &mut self.value + } + + // Take field + pub fn take_value(&mut self) -> ::std::vec::Vec { + ::std::mem::replace(&mut self.value, ::std::vec::Vec::new()) + } +} + +impl ::protobuf::Message for AnyData { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.type_id)?; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.value)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.type_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.type_id); + } + if !self.value.is_empty() { + my_size += ::protobuf::rt::bytes_size(2, &self.value); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.type_id.is_empty() { + os.write_string(1, &self.type_id)?; + } + if !self.value.is_empty() { + os.write_bytes(2, &self.value)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> AnyData { + AnyData::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "type_id", + |m: &AnyData| { &m.type_id }, + |m: &mut AnyData| { &mut m.type_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>( + "value", + |m: &AnyData| { &m.value }, + |m: &mut AnyData| { &mut m.value }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "AnyData", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static AnyData { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(AnyData::new) + } +} + +impl ::protobuf::Clear for AnyData { + fn clear(&mut self) { + self.type_id.clear(); + self.value.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for AnyData { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for AnyData { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct RowMeta { + // message fields + pub id: ::std::string::String, + pub block_id: ::std::string::String, + pub cell_by_field_id: ::std::collections::HashMap<::std::string::String, CellMeta>, + pub height: i32, + pub visibility: bool, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a RowMeta { + fn default() -> &'a RowMeta { + ::default_instance() + } +} + +impl RowMeta { + pub fn new() -> RowMeta { + ::std::default::Default::default() + } + + // string id = 1; + + + pub fn get_id(&self) -> &str { + &self.id + } + pub fn clear_id(&mut self) { + self.id.clear(); + } + + // Param is passed by value, moved + pub fn set_id(&mut self, v: ::std::string::String) { + self.id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_id(&mut self) -> &mut ::std::string::String { + &mut self.id + } + + // Take field + pub fn take_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.id, ::std::string::String::new()) + } + + // string block_id = 2; + + + pub fn get_block_id(&self) -> &str { + &self.block_id + } + pub fn clear_block_id(&mut self) { + self.block_id.clear(); + } + + // Param is passed by value, moved + pub fn set_block_id(&mut self, v: ::std::string::String) { + self.block_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_block_id(&mut self) -> &mut ::std::string::String { + &mut self.block_id + } + + // Take field + pub fn take_block_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.block_id, ::std::string::String::new()) + } + + // repeated .RowMeta.CellByFieldIdEntry cell_by_field_id = 3; + + + pub fn get_cell_by_field_id(&self) -> &::std::collections::HashMap<::std::string::String, CellMeta> { + &self.cell_by_field_id + } + pub fn clear_cell_by_field_id(&mut self) { + self.cell_by_field_id.clear(); + } + + // Param is passed by value, moved + pub fn set_cell_by_field_id(&mut self, v: ::std::collections::HashMap<::std::string::String, CellMeta>) { + self.cell_by_field_id = v; + } + + // Mutable pointer to the field. + pub fn mut_cell_by_field_id(&mut self) -> &mut ::std::collections::HashMap<::std::string::String, CellMeta> { + &mut self.cell_by_field_id + } + + // Take field + pub fn take_cell_by_field_id(&mut self) -> ::std::collections::HashMap<::std::string::String, CellMeta> { + ::std::mem::replace(&mut self.cell_by_field_id, ::std::collections::HashMap::new()) + } + + // int32 height = 4; + + + pub fn get_height(&self) -> i32 { + self.height + } + pub fn clear_height(&mut self) { + self.height = 0; + } + + // Param is passed by value, moved + pub fn set_height(&mut self, v: i32) { + self.height = v; + } + + // bool visibility = 5; + + + pub fn get_visibility(&self) -> bool { + self.visibility + } + pub fn clear_visibility(&mut self) { + self.visibility = false; + } + + // Param is passed by value, moved + pub fn set_visibility(&mut self, v: bool) { + self.visibility = v; + } +} + +impl ::protobuf::Message for RowMeta { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.block_id)?; + }, + 3 => { + ::protobuf::rt::read_map_into::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(wire_type, is, &mut self.cell_by_field_id)?; + }, + 4 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_int32()?; + self.height = tmp; + }, + 5 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_bool()?; + self.visibility = tmp; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.id); + } + if !self.block_id.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.block_id); + } + my_size += ::protobuf::rt::compute_map_size::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(3, &self.cell_by_field_id); + if self.height != 0 { + my_size += ::protobuf::rt::value_size(4, self.height, ::protobuf::wire_format::WireTypeVarint); + } + if self.visibility != false { + my_size += 2; + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.id.is_empty() { + os.write_string(1, &self.id)?; + } + if !self.block_id.is_empty() { + os.write_string(2, &self.block_id)?; + } + ::protobuf::rt::write_map_with_cached_sizes::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(3, &self.cell_by_field_id, os)?; + if self.height != 0 { + os.write_int32(4, self.height)?; + } + if self.visibility != false { + os.write_bool(5, self.visibility)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> RowMeta { + RowMeta::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "id", + |m: &RowMeta| { &m.id }, + |m: &mut RowMeta| { &mut m.id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "block_id", + |m: &RowMeta| { &m.block_id }, + |m: &mut RowMeta| { &mut m.block_id }, + )); + fields.push(::protobuf::reflect::accessor::make_map_accessor::<_, ::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>( + "cell_by_field_id", + |m: &RowMeta| { &m.cell_by_field_id }, + |m: &mut RowMeta| { &mut m.cell_by_field_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>( + "height", + |m: &RowMeta| { &m.height }, + |m: &mut RowMeta| { &mut m.height }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( + "visibility", + |m: &RowMeta| { &m.visibility }, + |m: &mut RowMeta| { &mut m.visibility }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "RowMeta", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static RowMeta { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(RowMeta::new) + } +} + +impl ::protobuf::Clear for RowMeta { + fn clear(&mut self) { + self.id.clear(); + self.block_id.clear(); + self.cell_by_field_id.clear(); + self.height = 0; + self.visibility = false; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for RowMeta { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for RowMeta { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct RowMetaChangeset { + // message fields + pub row_id: ::std::string::String, + pub cell_by_field_id: ::std::collections::HashMap<::std::string::String, CellMeta>, + // message oneof groups + pub one_of_height: ::std::option::Option, + pub one_of_visibility: ::std::option::Option, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a RowMetaChangeset { + fn default() -> &'a RowMetaChangeset { + ::default_instance() + } +} + +#[derive(Clone,PartialEq,Debug)] +pub enum RowMetaChangeset_oneof_one_of_height { + height(i32), +} + +#[derive(Clone,PartialEq,Debug)] +pub enum RowMetaChangeset_oneof_one_of_visibility { + visibility(bool), +} + +impl RowMetaChangeset { + pub fn new() -> RowMetaChangeset { + ::std::default::Default::default() + } + + // string row_id = 1; + + + pub fn get_row_id(&self) -> &str { + &self.row_id + } + pub fn clear_row_id(&mut self) { + self.row_id.clear(); + } + + // Param is passed by value, moved + pub fn set_row_id(&mut self, v: ::std::string::String) { + self.row_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_row_id(&mut self) -> &mut ::std::string::String { + &mut self.row_id + } + + // Take field + pub fn take_row_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.row_id, ::std::string::String::new()) + } + + // int32 height = 2; + + + pub fn get_height(&self) -> i32 { + match self.one_of_height { + ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_height::height(v)) => v, + _ => 0, + } + } + pub fn clear_height(&mut self) { + self.one_of_height = ::std::option::Option::None; + } + + pub fn has_height(&self) -> bool { + match self.one_of_height { + ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_height::height(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_height(&mut self, v: i32) { + self.one_of_height = ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_height::height(v)) + } + + // bool visibility = 3; + + + pub fn get_visibility(&self) -> bool { + match self.one_of_visibility { + ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_visibility::visibility(v)) => v, + _ => false, + } + } + pub fn clear_visibility(&mut self) { + self.one_of_visibility = ::std::option::Option::None; + } + + pub fn has_visibility(&self) -> bool { + match self.one_of_visibility { + ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_visibility::visibility(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_visibility(&mut self, v: bool) { + self.one_of_visibility = ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_visibility::visibility(v)) + } + + // repeated .RowMetaChangeset.CellByFieldIdEntry cell_by_field_id = 4; + + + pub fn get_cell_by_field_id(&self) -> &::std::collections::HashMap<::std::string::String, CellMeta> { + &self.cell_by_field_id + } + pub fn clear_cell_by_field_id(&mut self) { + self.cell_by_field_id.clear(); + } + + // Param is passed by value, moved + pub fn set_cell_by_field_id(&mut self, v: ::std::collections::HashMap<::std::string::String, CellMeta>) { + self.cell_by_field_id = v; + } + + // Mutable pointer to the field. + pub fn mut_cell_by_field_id(&mut self) -> &mut ::std::collections::HashMap<::std::string::String, CellMeta> { + &mut self.cell_by_field_id + } + + // Take field + pub fn take_cell_by_field_id(&mut self) -> ::std::collections::HashMap<::std::string::String, CellMeta> { + ::std::mem::replace(&mut self.cell_by_field_id, ::std::collections::HashMap::new()) + } +} + +impl ::protobuf::Message for RowMetaChangeset { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_id)?; + }, + 2 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_height = ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_height::height(is.read_int32()?)); + }, + 3 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_visibility = ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_visibility::visibility(is.read_bool()?)); + }, + 4 => { + ::protobuf::rt::read_map_into::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(wire_type, is, &mut self.cell_by_field_id)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.row_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.row_id); + } + my_size += ::protobuf::rt::compute_map_size::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(4, &self.cell_by_field_id); + if let ::std::option::Option::Some(ref v) = self.one_of_height { + match v { + &RowMetaChangeset_oneof_one_of_height::height(v) => { + my_size += ::protobuf::rt::value_size(2, v, ::protobuf::wire_format::WireTypeVarint); + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_visibility { + match v { + &RowMetaChangeset_oneof_one_of_visibility::visibility(v) => { + my_size += 2; + }, + }; + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.row_id.is_empty() { + os.write_string(1, &self.row_id)?; + } + ::protobuf::rt::write_map_with_cached_sizes::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>(4, &self.cell_by_field_id, os)?; + if let ::std::option::Option::Some(ref v) = self.one_of_height { + match v { + &RowMetaChangeset_oneof_one_of_height::height(v) => { + os.write_int32(2, v)?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_visibility { + match v { + &RowMetaChangeset_oneof_one_of_visibility::visibility(v) => { + os.write_bool(3, v)?; + }, + }; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> RowMetaChangeset { + RowMetaChangeset::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "row_id", + |m: &RowMetaChangeset| { &m.row_id }, + |m: &mut RowMetaChangeset| { &mut m.row_id }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_i32_accessor::<_>( + "height", + RowMetaChangeset::has_height, + RowMetaChangeset::get_height, + )); + fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>( + "visibility", + RowMetaChangeset::has_visibility, + RowMetaChangeset::get_visibility, + )); + fields.push(::protobuf::reflect::accessor::make_map_accessor::<_, ::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage>( + "cell_by_field_id", + |m: &RowMetaChangeset| { &m.cell_by_field_id }, + |m: &mut RowMetaChangeset| { &mut m.cell_by_field_id }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "RowMetaChangeset", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static RowMetaChangeset { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(RowMetaChangeset::new) + } +} + +impl ::protobuf::Clear for RowMetaChangeset { + fn clear(&mut self) { + self.row_id.clear(); + self.one_of_height = ::std::option::Option::None; + self.one_of_visibility = ::std::option::Option::None; + self.cell_by_field_id.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for RowMetaChangeset { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for RowMetaChangeset { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct CellMeta { + // message fields + pub field_id: ::std::string::String, + pub data: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a CellMeta { + fn default() -> &'a CellMeta { + ::default_instance() + } +} + +impl CellMeta { + pub fn new() -> CellMeta { + ::std::default::Default::default() + } + + // string field_id = 1; + + + pub fn get_field_id(&self) -> &str { + &self.field_id + } + pub fn clear_field_id(&mut self) { + self.field_id.clear(); + } + + // Param is passed by value, moved + pub fn set_field_id(&mut self, v: ::std::string::String) { + self.field_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_field_id(&mut self) -> &mut ::std::string::String { + &mut self.field_id + } + + // Take field + pub fn take_field_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.field_id, ::std::string::String::new()) + } + + // string data = 2; + + + pub fn get_data(&self) -> &str { + &self.data + } + pub fn clear_data(&mut self) { + self.data.clear(); + } + + // Param is passed by value, moved + pub fn set_data(&mut self, v: ::std::string::String) { + self.data = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_data(&mut self) -> &mut ::std::string::String { + &mut self.data + } + + // Take field + pub fn take_data(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.data, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for CellMeta { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.data)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.field_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.field_id); + } + if !self.data.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.data); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.field_id.is_empty() { + os.write_string(1, &self.field_id)?; + } + if !self.data.is_empty() { + os.write_string(2, &self.data)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> CellMeta { + CellMeta::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "field_id", + |m: &CellMeta| { &m.field_id }, + |m: &mut CellMeta| { &mut m.field_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "data", + |m: &CellMeta| { &m.data }, + |m: &mut CellMeta| { &mut m.data }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "CellMeta", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static CellMeta { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(CellMeta::new) + } +} + +impl ::protobuf::Clear for CellMeta { + fn clear(&mut self) { + self.field_id.clear(); + self.data.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for CellMeta { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for CellMeta { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct CellMetaChangeset { + // message fields + pub grid_id: ::std::string::String, + pub row_id: ::std::string::String, + pub field_id: ::std::string::String, + // message oneof groups + pub one_of_data: ::std::option::Option, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a CellMetaChangeset { + fn default() -> &'a CellMetaChangeset { + ::default_instance() + } +} + +#[derive(Clone,PartialEq,Debug)] +pub enum CellMetaChangeset_oneof_one_of_data { + data(::std::string::String), +} + +impl CellMetaChangeset { + pub fn new() -> CellMetaChangeset { + ::std::default::Default::default() + } + + // string grid_id = 1; + + + pub fn get_grid_id(&self) -> &str { + &self.grid_id + } + pub fn clear_grid_id(&mut self) { + self.grid_id.clear(); + } + + // Param is passed by value, moved + pub fn set_grid_id(&mut self, v: ::std::string::String) { + self.grid_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_grid_id(&mut self) -> &mut ::std::string::String { + &mut self.grid_id + } + + // Take field + pub fn take_grid_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.grid_id, ::std::string::String::new()) + } + + // string row_id = 2; + + + pub fn get_row_id(&self) -> &str { + &self.row_id + } + pub fn clear_row_id(&mut self) { + self.row_id.clear(); + } + + // Param is passed by value, moved + pub fn set_row_id(&mut self, v: ::std::string::String) { + self.row_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_row_id(&mut self) -> &mut ::std::string::String { + &mut self.row_id + } + + // Take field + pub fn take_row_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.row_id, ::std::string::String::new()) + } + + // string field_id = 3; + + + pub fn get_field_id(&self) -> &str { + &self.field_id + } + pub fn clear_field_id(&mut self) { + self.field_id.clear(); + } + + // Param is passed by value, moved + pub fn set_field_id(&mut self, v: ::std::string::String) { + self.field_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_field_id(&mut self) -> &mut ::std::string::String { + &mut self.field_id + } + + // Take field + pub fn take_field_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.field_id, ::std::string::String::new()) + } + + // string data = 4; + + + pub fn get_data(&self) -> &str { + match self.one_of_data { + ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(ref v)) => v, + _ => "", + } + } + pub fn clear_data(&mut self) { + self.one_of_data = ::std::option::Option::None; + } + + pub fn has_data(&self) -> bool { + match self.one_of_data { + ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_data(&mut self, v: ::std::string::String) { + self.one_of_data = ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(v)) + } + + // Mutable pointer to the field. + pub fn mut_data(&mut self) -> &mut ::std::string::String { + if let ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(_)) = self.one_of_data { + } else { + self.one_of_data = ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(::std::string::String::new())); + } + match self.one_of_data { + ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_data(&mut self) -> ::std::string::String { + if self.has_data() { + match self.one_of_data.take() { + ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(v)) => v, + _ => panic!(), + } + } else { + ::std::string::String::new() + } + } +} + +impl ::protobuf::Message for CellMetaChangeset { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_id)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?; + }, + 4 => { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_data = ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(is.read_string()?)); + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.grid_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.grid_id); + } + if !self.row_id.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.row_id); + } + if !self.field_id.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.field_id); + } + if let ::std::option::Option::Some(ref v) = self.one_of_data { + match v { + &CellMetaChangeset_oneof_one_of_data::data(ref v) => { + my_size += ::protobuf::rt::string_size(4, &v); + }, + }; + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.grid_id.is_empty() { + os.write_string(1, &self.grid_id)?; + } + if !self.row_id.is_empty() { + os.write_string(2, &self.row_id)?; + } + if !self.field_id.is_empty() { + os.write_string(3, &self.field_id)?; + } + if let ::std::option::Option::Some(ref v) = self.one_of_data { + match v { + &CellMetaChangeset_oneof_one_of_data::data(ref v) => { + os.write_string(4, v)?; + }, + }; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> CellMetaChangeset { + CellMetaChangeset::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "grid_id", + |m: &CellMetaChangeset| { &m.grid_id }, + |m: &mut CellMetaChangeset| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "row_id", + |m: &CellMetaChangeset| { &m.row_id }, + |m: &mut CellMetaChangeset| { &mut m.row_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "field_id", + |m: &CellMetaChangeset| { &m.field_id }, + |m: &mut CellMetaChangeset| { &mut m.field_id }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( + "data", + CellMetaChangeset::has_data, + CellMetaChangeset::get_data, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "CellMetaChangeset", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static CellMetaChangeset { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(CellMetaChangeset::new) + } +} + +impl ::protobuf::Clear for CellMetaChangeset { + fn clear(&mut self) { + self.grid_id.clear(); + self.row_id.clear(); + self.field_id.clear(); + self.one_of_data = ::std::option::Option::None; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for CellMetaChangeset { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for CellMetaChangeset { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct BuildGridContext { + // message fields + pub field_metas: ::protobuf::RepeatedField, + pub block_metas: ::protobuf::SingularPtrField, + pub block_meta_data: ::protobuf::SingularPtrField, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a BuildGridContext { + fn default() -> &'a BuildGridContext { + ::default_instance() + } +} + +impl BuildGridContext { + pub fn new() -> BuildGridContext { + ::std::default::Default::default() + } + + // repeated .FieldMeta field_metas = 1; + + + pub fn get_field_metas(&self) -> &[FieldMeta] { + &self.field_metas + } + pub fn clear_field_metas(&mut self) { + self.field_metas.clear(); + } + + // Param is passed by value, moved + pub fn set_field_metas(&mut self, v: ::protobuf::RepeatedField) { + self.field_metas = v; + } + + // Mutable pointer to the field. + pub fn mut_field_metas(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.field_metas + } + + // Take field + pub fn take_field_metas(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.field_metas, ::protobuf::RepeatedField::new()) + } + + // .GridBlockMeta block_metas = 2; + + + pub fn get_block_metas(&self) -> &GridBlockMeta { + self.block_metas.as_ref().unwrap_or_else(|| ::default_instance()) + } + pub fn clear_block_metas(&mut self) { + self.block_metas.clear(); + } + + pub fn has_block_metas(&self) -> bool { + self.block_metas.is_some() + } + + // Param is passed by value, moved + pub fn set_block_metas(&mut self, v: GridBlockMeta) { + self.block_metas = ::protobuf::SingularPtrField::some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_block_metas(&mut self) -> &mut GridBlockMeta { + if self.block_metas.is_none() { + self.block_metas.set_default(); + } + self.block_metas.as_mut().unwrap() + } + + // Take field + pub fn take_block_metas(&mut self) -> GridBlockMeta { + self.block_metas.take().unwrap_or_else(|| GridBlockMeta::new()) + } + + // .GridBlockMetaSerde block_meta_data = 3; + + + pub fn get_block_meta_data(&self) -> &GridBlockMetaSerde { + self.block_meta_data.as_ref().unwrap_or_else(|| ::default_instance()) + } + pub fn clear_block_meta_data(&mut self) { + self.block_meta_data.clear(); + } + + pub fn has_block_meta_data(&self) -> bool { + self.block_meta_data.is_some() + } + + // Param is passed by value, moved + pub fn set_block_meta_data(&mut self, v: GridBlockMetaSerde) { + self.block_meta_data = ::protobuf::SingularPtrField::some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_block_meta_data(&mut self) -> &mut GridBlockMetaSerde { + if self.block_meta_data.is_none() { + self.block_meta_data.set_default(); + } + self.block_meta_data.as_mut().unwrap() + } + + // Take field + pub fn take_block_meta_data(&mut self) -> GridBlockMetaSerde { + self.block_meta_data.take().unwrap_or_else(|| GridBlockMetaSerde::new()) + } +} + +impl ::protobuf::Message for BuildGridContext { + fn is_initialized(&self) -> bool { + for v in &self.field_metas { + if !v.is_initialized() { + return false; + } + }; + for v in &self.block_metas { + if !v.is_initialized() { + return false; + } + }; + for v in &self.block_meta_data { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.field_metas)?; + }, + 2 => { + ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.block_metas)?; + }, + 3 => { + ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.block_meta_data)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + for value in &self.field_metas { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + if let Some(ref v) = self.block_metas.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } + if let Some(ref v) = self.block_meta_data.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + for v in &self.field_metas { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + if let Some(ref v) = self.block_metas.as_ref() { + os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + } + if let Some(ref v) = self.block_meta_data.as_ref() { + os.write_tag(3, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> BuildGridContext { + BuildGridContext::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "field_metas", + |m: &BuildGridContext| { &m.field_metas }, + |m: &mut BuildGridContext| { &mut m.field_metas }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "block_metas", + |m: &BuildGridContext| { &m.block_metas }, + |m: &mut BuildGridContext| { &mut m.block_metas }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "block_meta_data", + |m: &BuildGridContext| { &m.block_meta_data }, + |m: &mut BuildGridContext| { &mut m.block_meta_data }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "BuildGridContext", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static BuildGridContext { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(BuildGridContext::new) + } +} + +impl ::protobuf::Clear for BuildGridContext { + fn clear(&mut self) { + self.field_metas.clear(); + self.block_metas.clear(); + self.block_meta_data.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for BuildGridContext { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for BuildGridContext { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(Clone,PartialEq,Eq,Debug,Hash)] +pub enum FieldType { + RichText = 0, + Number = 1, + DateTime = 2, + SingleSelect = 3, + MultiSelect = 4, + Checkbox = 5, +} + +impl ::protobuf::ProtobufEnum for FieldType { + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(FieldType::RichText), + 1 => ::std::option::Option::Some(FieldType::Number), + 2 => ::std::option::Option::Some(FieldType::DateTime), + 3 => ::std::option::Option::Some(FieldType::SingleSelect), + 4 => ::std::option::Option::Some(FieldType::MultiSelect), + 5 => ::std::option::Option::Some(FieldType::Checkbox), + _ => ::std::option::Option::None + } + } + + fn values() -> &'static [Self] { + static values: &'static [FieldType] = &[ + FieldType::RichText, + FieldType::Number, + FieldType::DateTime, + FieldType::SingleSelect, + FieldType::MultiSelect, + FieldType::Checkbox, + ]; + values + } + + fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + ::protobuf::reflect::EnumDescriptor::new_pb_name::("FieldType", file_descriptor_proto()) + }) + } +} + +impl ::std::marker::Copy for FieldType { +} + +impl ::std::default::Default for FieldType { + fn default() -> Self { + FieldType::RichText + } +} + +impl ::protobuf::reflect::ProtobufValue for FieldType { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\nmeta.proto\"x\n\x08GridMeta\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\ + \x06gridId\x12\"\n\x06fields\x18\x02\x20\x03(\x0b2\n.FieldMetaR\x06field\ + s\x12/\n\x0bblock_metas\x18\x03\x20\x03(\x0b2\x0e.GridBlockMetaR\nblockM\ + etas\"o\n\rGridBlockMeta\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07bl\ + ockId\x12&\n\x0fstart_row_index\x18\x02\x20\x01(\x05R\rstartRowIndex\x12\ + \x1b\n\trow_count\x18\x03\x20\x01(\x05R\x08rowCount\"V\n\x12GridBlockMet\ + aSerde\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12%\n\trow_\ + metas\x18\x02\x20\x03(\x0b2\x08.RowMetaR\x08rowMetas\"\xdf\x01\n\tFieldM\ + eta\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12\x12\n\x04name\x18\x02\ + \x20\x01(\tR\x04name\x12\x12\n\x04desc\x18\x03\x20\x01(\tR\x04desc\x12)\ + \n\nfield_type\x18\x04\x20\x01(\x0e2\n.FieldTypeR\tfieldType\x12\x16\n\ + \x06frozen\x18\x05\x20\x01(\x08R\x06frozen\x12\x1e\n\nvisibility\x18\x06\ + \x20\x01(\x08R\nvisibility\x12\x14\n\x05width\x18\x07\x20\x01(\x05R\x05w\ + idth\x12!\n\x0ctype_options\x18\x08\x20\x01(\tR\x0btypeOptions\"\xfd\x02\ + \n\x0eFieldChangeset\x12\x19\n\x08field_id\x18\x01\x20\x01(\tR\x07fieldI\ + d\x12\x14\n\x04name\x18\x02\x20\x01(\tH\0R\x04name\x12\x14\n\x04desc\x18\ + \x03\x20\x01(\tH\x01R\x04desc\x12+\n\nfield_type\x18\x04\x20\x01(\x0e2\n\ + .FieldTypeH\x02R\tfieldType\x12\x18\n\x06frozen\x18\x05\x20\x01(\x08H\ + \x03R\x06frozen\x12\x20\n\nvisibility\x18\x06\x20\x01(\x08H\x04R\nvisibi\ + lity\x12\x16\n\x05width\x18\x07\x20\x01(\x05H\x05R\x05width\x12#\n\x0cty\ + pe_options\x18\x08\x20\x01(\tH\x06R\x0btypeOptionsB\r\n\x0bone_of_nameB\ + \r\n\x0bone_of_descB\x13\n\x11one_of_field_typeB\x0f\n\rone_of_frozenB\ + \x13\n\x11one_of_visibilityB\x0e\n\x0cone_of_widthB\x15\n\x13one_of_type\ + _options\"8\n\x07AnyData\x12\x17\n\x07type_id\x18\x01\x20\x01(\tR\x06typ\ + eId\x12\x14\n\x05value\x18\x02\x20\x01(\x0cR\x05value\"\xff\x01\n\x07Row\ + Meta\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12\x19\n\x08block_id\x18\ + \x02\x20\x01(\tR\x07blockId\x12D\n\x10cell_by_field_id\x18\x03\x20\x03(\ + \x0b2\x1b.RowMeta.CellByFieldIdEntryR\rcellByFieldId\x12\x16\n\x06height\ + \x18\x04\x20\x01(\x05R\x06height\x12\x1e\n\nvisibility\x18\x05\x20\x01(\ + \x08R\nvisibility\x1aK\n\x12CellByFieldIdEntry\x12\x10\n\x03key\x18\x01\ + \x20\x01(\tR\x03key\x12\x1f\n\x05value\x18\x02\x20\x01(\x0b2\t.CellMetaR\ + \x05value:\x028\x01\"\xa7\x02\n\x10RowMetaChangeset\x12\x15\n\x06row_id\ + \x18\x01\x20\x01(\tR\x05rowId\x12\x18\n\x06height\x18\x02\x20\x01(\x05H\ + \0R\x06height\x12\x20\n\nvisibility\x18\x03\x20\x01(\x08H\x01R\nvisibili\ + ty\x12M\n\x10cell_by_field_id\x18\x04\x20\x03(\x0b2$.RowMetaChangeset.Ce\ + llByFieldIdEntryR\rcellByFieldId\x1aK\n\x12CellByFieldIdEntry\x12\x10\n\ + \x03key\x18\x01\x20\x01(\tR\x03key\x12\x1f\n\x05value\x18\x02\x20\x01(\ + \x0b2\t.CellMetaR\x05value:\x028\x01B\x0f\n\rone_of_heightB\x13\n\x11one\ + _of_visibility\"9\n\x08CellMeta\x12\x19\n\x08field_id\x18\x01\x20\x01(\t\ + R\x07fieldId\x12\x12\n\x04data\x18\x02\x20\x01(\tR\x04data\"\x83\x01\n\ + \x11CellMetaChangeset\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\ + \x12\x15\n\x06row_id\x18\x02\x20\x01(\tR\x05rowId\x12\x19\n\x08field_id\ + \x18\x03\x20\x01(\tR\x07fieldId\x12\x14\n\x04data\x18\x04\x20\x01(\tH\0R\ + \x04dataB\r\n\x0bone_of_data\"\xad\x01\n\x10BuildGridContext\x12+\n\x0bf\ + ield_metas\x18\x01\x20\x03(\x0b2\n.FieldMetaR\nfieldMetas\x12/\n\x0bbloc\ + k_metas\x18\x02\x20\x01(\x0b2\x0e.GridBlockMetaR\nblockMetas\x12;\n\x0fb\ + lock_meta_data\x18\x03\x20\x01(\x0b2\x13.GridBlockMetaSerdeR\rblockMetaD\ + ata*d\n\tFieldType\x12\x0c\n\x08RichText\x10\0\x12\n\n\x06Number\x10\x01\ + \x12\x0c\n\x08DateTime\x10\x02\x12\x10\n\x0cSingleSelect\x10\x03\x12\x0f\ + \n\x0bMultiSelect\x10\x04\x12\x0c\n\x08Checkbox\x10\x05b\x06proto3\ +"; + +static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; + +fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { + ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() +} + +pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { + file_descriptor_proto_lazy.get(|| { + parse_descriptor_proto() + }) +} diff --git a/shared-lib/flowy-grid-data-model/src/protobuf/model/mod.rs b/shared-lib/flowy-grid-data-model/src/protobuf/model/mod.rs index 7b56c6cee8..d011b76000 100644 --- a/shared-lib/flowy-grid-data-model/src/protobuf/model/mod.rs +++ b/shared-lib/flowy-grid-data-model/src/protobuf/model/mod.rs @@ -3,3 +3,6 @@ mod grid; pub use grid::*; + +mod meta; +pub use meta::*; diff --git a/shared-lib/flowy-grid-data-model/src/protobuf/proto/grid.proto b/shared-lib/flowy-grid-data-model/src/protobuf/proto/grid.proto index 79d6af77e1..2ce7c429d5 100644 --- a/shared-lib/flowy-grid-data-model/src/protobuf/proto/grid.proto +++ b/shared-lib/flowy-grid-data-model/src/protobuf/proto/grid.proto @@ -1,16 +1,10 @@ syntax = "proto3"; +import "meta.proto"; message Grid { string id = 1; - RepeatedFieldOrder field_orders = 2; - RepeatedRowOrder row_orders = 3; -} -message FieldOrder { - string field_id = 1; - bool visibility = 2; -} -message RepeatedFieldOrder { - repeated FieldOrder items = 1; + repeated FieldOrder field_orders = 2; + repeated GridBlockOrder block_orders = 3; } message Field { string id = 1; @@ -18,52 +12,47 @@ message Field { string desc = 3; FieldType field_type = 4; bool frozen = 5; - int32 width = 6; - AnyData type_options = 7; + bool visibility = 6; + int32 width = 7; +} +message FieldOrder { + string field_id = 1; } message RepeatedField { repeated Field items = 1; } -message AnyData { - string type_id = 1; - bytes value = 2; +message RepeatedFieldOrder { + repeated FieldOrder items = 1; } message RowOrder { - string grid_id = 1; - string row_id = 2; - bool visibility = 3; -} -message RepeatedRowOrder { - repeated RowOrder items = 1; -} -message RawRow { - string id = 1; - string grid_id = 2; - map cell_by_field_id = 3; -} -message RawCell { - string id = 1; - string row_id = 2; - string field_id = 3; - AnyData data = 4; -} -message RepeatedRow { - repeated Row items = 1; + string row_id = 1; + string block_id = 2; + int32 height = 3; } message Row { string id = 1; map cell_by_field_id = 2; + int32 height = 3; +} +message RepeatedRow { + repeated Row items = 1; +} +message RepeatedGridBlock { + repeated GridBlock items = 1; +} +message GridBlockOrder { + string block_id = 1; +} +message GridBlock { + string block_id = 1; + repeated RowOrder row_orders = 2; } message Cell { - string id = 1; - string field_id = 2; - string content = 3; + string field_id = 1; + string content = 2; } -message CellChangeset { - string id = 1; - string row_id = 2; - string field_id = 3; - string data = 4; +message RepeatedCell { + repeated Cell items = 1; } message CreateGridPayload { string name = 1; @@ -71,19 +60,23 @@ message CreateGridPayload { message GridId { string value = 1; } +message GridBlockId { + string value = 1; +} +message CreateRowPayload { + string grid_id = 1; + oneof one_of_start_row_id { string start_row_id = 2; }; +} message QueryFieldPayload { string grid_id = 1; RepeatedFieldOrder field_orders = 2; } +message QueryGridBlocksPayload { + string grid_id = 1; + repeated GridBlockOrder block_orders = 2; +} message QueryRowPayload { string grid_id = 1; - RepeatedRowOrder row_orders = 2; -} -enum FieldType { - RichText = 0; - Number = 1; - DateTime = 2; - SingleSelect = 3; - MultiSelect = 4; - Checkbox = 5; + string block_id = 2; + string row_id = 3; } diff --git a/shared-lib/flowy-grid-data-model/src/protobuf/proto/meta.proto b/shared-lib/flowy-grid-data-model/src/protobuf/proto/meta.proto new file mode 100644 index 0000000000..24e1d22696 --- /dev/null +++ b/shared-lib/flowy-grid-data-model/src/protobuf/proto/meta.proto @@ -0,0 +1,76 @@ +syntax = "proto3"; + +message GridMeta { + string grid_id = 1; + repeated FieldMeta fields = 2; + repeated GridBlockMeta block_metas = 3; +} +message GridBlockMeta { + string block_id = 1; + int32 start_row_index = 2; + int32 row_count = 3; +} +message GridBlockMetaSerde { + string block_id = 1; + repeated RowMeta row_metas = 2; +} +message FieldMeta { + string id = 1; + string name = 2; + string desc = 3; + FieldType field_type = 4; + bool frozen = 5; + bool visibility = 6; + int32 width = 7; + string type_options = 8; +} +message FieldChangeset { + string field_id = 1; + oneof one_of_name { string name = 2; }; + oneof one_of_desc { string desc = 3; }; + oneof one_of_field_type { FieldType field_type = 4; }; + oneof one_of_frozen { bool frozen = 5; }; + oneof one_of_visibility { bool visibility = 6; }; + oneof one_of_width { int32 width = 7; }; + oneof one_of_type_options { string type_options = 8; }; +} +message AnyData { + string type_id = 1; + bytes value = 2; +} +message RowMeta { + string id = 1; + string block_id = 2; + map cell_by_field_id = 3; + int32 height = 4; + bool visibility = 5; +} +message RowMetaChangeset { + string row_id = 1; + oneof one_of_height { int32 height = 2; }; + oneof one_of_visibility { bool visibility = 3; }; + map cell_by_field_id = 4; +} +message CellMeta { + string field_id = 1; + string data = 2; +} +message CellMetaChangeset { + string grid_id = 1; + string row_id = 2; + string field_id = 3; + oneof one_of_data { string data = 4; }; +} +message BuildGridContext { + repeated FieldMeta field_metas = 1; + GridBlockMeta block_metas = 2; + GridBlockMetaSerde block_meta_data = 3; +} +enum FieldType { + RichText = 0; + Number = 1; + DateTime = 2; + SingleSelect = 3; + MultiSelect = 4; + Checkbox = 5; +} diff --git a/shared-lib/flowy-grid-data-model/tests/serde_test.rs b/shared-lib/flowy-grid-data-model/tests/serde_test.rs index 287ffffa6b..15367cc5ac 100644 --- a/shared-lib/flowy-grid-data-model/tests/serde_test.rs +++ b/shared-lib/flowy-grid-data-model/tests/serde_test.rs @@ -3,54 +3,38 @@ use flowy_grid_data_model::entities::*; #[test] fn grid_serde_test() { let grid_id = "1".to_owned(); - let field_orders = RepeatedFieldOrder { - items: vec![create_field_order("1")], - }; - let row_orders = RepeatedRowOrder { - items: vec![create_row_order(&grid_id, "1")], + let fields = vec![create_field("1")]; + let grid = GridMeta { + grid_id, + fields, + block_metas: vec![], }; - let grid = Grid { - id: grid_id, - field_orders, - row_orders, - }; - - let json = serde_json::to_string(&grid).unwrap(); - let grid2: Grid = serde_json::from_str(&json).unwrap(); - assert_eq!(grid, grid2); + let grid_1_json = serde_json::to_string(&grid).unwrap(); + let _: GridMeta = serde_json::from_str(&grid_1_json).unwrap(); assert_eq!( - json, - r#"{"id":"1","field_orders":[{"field_id":"1","visibility":false}],"row_orders":[{"grid_id":"1","row_id":"1","visibility":false}]}"# + grid_1_json, + r#"{"id":"1","fields":[{"id":"1","name":"Text Field","desc":"","field_type":"RichText","frozen":false,"visibility":true,"width":150,"type_options":{"type_id":"","value":[]}}],"blocks":[]}"# ) } #[test] fn grid_default_serde_test() { let grid_id = "1".to_owned(); - let grid = Grid { - id: grid_id, - field_orders: RepeatedFieldOrder::default(), - row_orders: RepeatedRowOrder::default(), + let grid = GridMeta { + grid_id, + fields: vec![], + block_metas: vec![], }; let json = serde_json::to_string(&grid).unwrap(); - assert_eq!(json, r#"{"id":"1","field_orders":[],"row_orders":[]}"#) + assert_eq!(json, r#"{"id":"1","fields":[],"blocks":[]}"#) } -fn create_field_order(field_id: &str) -> FieldOrder { - FieldOrder { - field_id: field_id.to_owned(), - visibility: false, - } -} - -fn create_row_order(grid_id: &str, row_id: &str) -> RowOrder { - RowOrder { - grid_id: grid_id.to_string(), - row_id: row_id.to_string(), - visibility: false, - } +fn create_field(field_id: &str) -> FieldMeta { + let mut field = FieldMeta::new("Text Field", "", FieldType::RichText); + field.id = field_id.to_string(); + field } #[allow(dead_code)] diff --git a/shared-lib/lib-infra/src/future.rs b/shared-lib/lib-infra/src/future.rs index 9a0b6550dd..9077dd18b7 100644 --- a/shared-lib/lib-infra/src/future.rs +++ b/shared-lib/lib-infra/src/future.rs @@ -65,34 +65,3 @@ where } pub type BoxResultFuture<'a, T, E> = BoxFuture<'a, Result>; - -#[pin_project] -pub struct FutureResultSend { - #[pin] - pub fut: Pin> + Send>>, -} - -impl FutureResultSend { - pub fn new(f: F) -> Self - where - F: Future> + Send + 'static, - { - Self { - fut: Box::pin(async { f.await }), - } - } -} - -impl Future for FutureResultSend -where - T: Send, - E: Debug, -{ - type Output = Result; - - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let this = self.as_mut().project(); - let result = ready!(this.fut.poll(cx)); - Poll::Ready(result) - } -} diff --git a/shared-lib/lib-ot/src/core/delta/delta.rs b/shared-lib/lib-ot/src/core/delta/delta.rs index e9a7e15e12..29fd424dcb 100644 --- a/shared-lib/lib-ot/src/core/delta/delta.rs +++ b/shared-lib/lib-ot/src/core/delta/delta.rs @@ -501,7 +501,7 @@ impl Delta where T: Attributes + DeserializeOwned, { - pub fn from_json(json: &str) -> Result { + pub fn from_delta_str(json: &str) -> Result { let delta = serde_json::from_str(json).map_err(|e| { tracing::trace!("Deserialize failed: {:?}", e); tracing::trace!("{:?}", json); @@ -512,7 +512,7 @@ where pub fn from_bytes>(bytes: B) -> Result { let json = str::from_utf8(bytes.as_ref())?.to_owned(); - let val = Self::from_json(&json)?; + let val = Self::from_delta_str(&json)?; Ok(val) } } @@ -529,7 +529,7 @@ where self.apply("") } - pub fn to_bytes(&self) -> Bytes { + pub fn to_delta_bytes(&self) -> Bytes { let json = self.to_delta_str(); Bytes::from(json.into_bytes()) }