Nimbus Generator

nimbus_generator is a type conversion Nimbus client generator using source_gen and inspired by Chopper and Retrofit.

Usage

Generator

Add the generator to your dev dependencies

dependencies:
  nimbus4flutter: any
  nimbus_annotation: any

dev_dependencies:
  nimbus_generator: any
  build_runner: any

Define and Generate your API

import 'package:http/http.dart';
import 'package:nimbus4flutter/nimbus4flutter.dart';
import 'package:nimbus_annotation/nimbus_annotation.dart';

part 'example.g.dart';

@NimbusApi()
abstract class ApiService {
  factory ApiService({
    required String baseUrl,
    ApiServerHttpRequestBuilder? requestBuilder,
    ApiServerHttpResponseParser? responseParser,
  }) = _ApiService;

  @GET('/tasks')
  Future<List<Task>> getTasks();
}

@DatasetSerializable()
class Task {
  const Task({this.common});

  factory Task.fromJson(Map<String, dynamic> json) => _$TaskFromJson(json);

  @DatasetHeader()
  final CommonRecord? common;

  Map<String, dynamic> toJson() => _$TaskToJson(this);
}

@RecordSerializable()
class CommonRecord {
  CommonRecord({this.resultCode, this.resultMessage});

  factory CommonRecord.fromJson(Map<String, dynamic> json) =>
      _$CommonRecordFromJson(json);

  static RecordSchema? get schema => _$CommonRecordSchema();

  Map<String, dynamic> toJson() => _$CommonRecordToJson(this);

  final String? resultCode;
  final String? resultMessage;
}

then run the generator

# dart
dart pub run build_runner build

# flutter	
flutter pub run build_runner build

Use it

import 'package:dio/dio.dart';
import 'package:logger/logger.dart';
import 'package:retrofit_example/example.dart';

final logger = Logger();

void main(List<String> args) {
  final client = ApiService(
    baseUrl: 'localhost:8080', 
    requestBuilder:  (request, method, input) async {
        request.headers['Content-Type'] = 'application/json; charset=utf-8';
        request.as<http.Request>()?.body = jsonEncode(input);
    },
    responseParser: (response, method, output) async {
        if (response.statusCode != HttpStatus.ok) {
          throw Exception('error status = ${response.statusCode}');
        }
        if (response is http.Response) {
          final json = const JsonDecoder().convert(response.body);

          (output as Map<String, dynamic>).addAll(json);
        }
    }
  );

  client.getTasks().then((it) => logger.i(it));
}

Libraries

nimbus_annotation