Skip to content

Commit

Permalink
refactor: Restrict subclassing of RelicAddress using 'abstract final'
Browse files Browse the repository at this point in the history
  • Loading branch information
klkucaj committed Jan 3, 2025
1 parent 243e40b commit 9aeb121
Show file tree
Hide file tree
Showing 7 changed files with 19 additions and 23 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ void main() async {
var server = await serve(
handler,
RelicHostnameAddress(hostname: 'localhost'),
RelicAddress.fromHostname('localhost'),
8080,
);
Expand Down
3 changes: 1 addition & 2 deletions example/example.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import 'package:relic/relic.dart';
import 'package:relic/src/address/relic_address.dart';

void main() async {
var handler =
const Pipeline().addMiddleware(logRequests()).addHandler(_echoRequest);

var server = await serve(
handler,
RelicHostnameAddress(hostname: 'localhost'),
RelicAddress.fromHostname('localhost'),
8080,
);

Expand Down
3 changes: 1 addition & 2 deletions lib/relic.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,7 @@ export 'src/middleware/middleware.dart' show Middleware, createMiddleware;
export 'src/middleware/middleware_extensions.dart' show MiddlewareExtensions;

/// Relic server related exports
export 'src/address/relic_address.dart'
show RelicAddress, RelicHostnameAddress, RelicInternetAddress;
export 'src/address/relic_address.dart' show RelicAddress;
export 'dart:io' show InternetAddress;
export 'src/relic_server.dart' show RelicServer;
export 'src/relic_server_serve.dart' show serve;
Expand Down
14 changes: 7 additions & 7 deletions lib/src/address/relic_address.dart
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
import 'dart:io';

/// A class that represents an address.
abstract class RelicAddress<T> {
abstract final class RelicAddress<T> {
/// Returns the address as an [Object].
T get address;

/// Creates a [RelicAddress] from a [String].
static RelicAddress<String> fromHostname(String hostname) {
return RelicHostnameAddress(hostname: hostname);
return _RelicHostnameAddress(hostname: hostname);
}

/// Creates a [RelicAddress] from an [InternetAddress].
static RelicAddress<InternetAddress> fromInternetAddress(
InternetAddress address,
) {
return RelicInternetAddress(internetAddress: address);
return _RelicInternetAddress(internetAddress: address);
}
}

/// A class that represents a hostname address.
class RelicHostnameAddress implements RelicAddress<String> {
final class _RelicHostnameAddress implements RelicAddress<String> {
/// The hostname of the address.
final String hostname;

RelicHostnameAddress({
_RelicHostnameAddress({
required this.hostname,
});

Expand All @@ -36,11 +36,11 @@ class RelicHostnameAddress implements RelicAddress<String> {
}

/// A class that represents an internet address.
class RelicInternetAddress implements RelicAddress<InternetAddress> {
final class _RelicInternetAddress implements RelicAddress<InternetAddress> {
/// The internet address of the address.
final InternetAddress internetAddress;

RelicInternetAddress({
_RelicInternetAddress({
required this.internetAddress,
});

Expand Down
5 changes: 2 additions & 3 deletions test/headers/headers_test_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import 'dart:io';

import 'package:relic/relic.dart';
import 'package:http/http.dart' as http;
import 'package:relic/src/address/relic_address.dart';

/// Thrown when the server returns a 400 status code.
class BadRequestException implements Exception {
Expand All @@ -22,13 +21,13 @@ Future<RelicServer> createServer({
}) async {
try {
return RelicServer.createServer(
RelicInternetAddress(internetAddress: InternetAddress.loopbackIPv6),
RelicAddress.fromInternetAddress(InternetAddress.loopbackIPv6),
0,
strictHeaders: strictHeaders,
);
} on SocketException catch (_) {
return RelicServer.createServer(
RelicInternetAddress(internetAddress: InternetAddress.loopbackIPv4),
RelicAddress.fromInternetAddress(InternetAddress.loopbackIPv4),
0,
strictHeaders: strictHeaders,
);
Expand Down
11 changes: 5 additions & 6 deletions test/relic_server_serve_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import 'package:async/async.dart';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart' as parser;
import 'package:relic/relic.dart';
import 'package:relic/src/address/relic_address.dart';
import 'package:relic/src/method/request_method.dart';
import 'package:relic/src/relic_server_serve.dart' as relic_server;
import 'package:test/test.dart';
Expand Down Expand Up @@ -286,7 +285,7 @@ void main() {
Future(() => throw StateError('oh no'));
return syncHandler(request);
},
RelicHostnameAddress(hostname: 'localhost'),
RelicAddress.fromHostname('localhost'),
0,
);

Expand All @@ -306,7 +305,7 @@ void main() {
Future(() => throw StateError('oh no'));
return syncHandler(request);
},
RelicHostnameAddress(hostname: 'localhost'),
RelicAddress.fromHostname('localhost'),
0,
);

Expand Down Expand Up @@ -417,7 +416,7 @@ void main() {
test('can be set at the server level', () async {
_server = await relic_server.serve(
syncHandler,
RelicHostnameAddress(hostname: 'localhost'),
RelicAddress.fromHostname('localhost'),
0,
poweredByHeader: 'ourServer',
);
Expand All @@ -438,7 +437,7 @@ void main() {
),
);
},
RelicHostnameAddress(hostname: 'localhost'),
RelicAddress.fromHostname('localhost'),
0,
poweredByHeader: 'ourServer',
);
Expand Down Expand Up @@ -654,7 +653,7 @@ Future<void> _scheduleServer(
assert(_server == null);
_server = await relic_server.serve(
handler,
RelicHostnameAddress(hostname: 'localhost'),
RelicAddress.fromHostname('localhost'),
0,
securityContext: securityContext,
);
Expand Down
4 changes: 2 additions & 2 deletions test/relic_server_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ void main() {
setUp(() async {
try {
server = await RelicServer.createServer(
RelicInternetAddress(internetAddress: InternetAddress.loopbackIPv6),
RelicAddress.fromInternetAddress(InternetAddress.loopbackIPv6),
0,
);
} on SocketException catch (_) {
server = await RelicServer.createServer(
RelicInternetAddress(internetAddress: InternetAddress.loopbackIPv4),
RelicAddress.fromInternetAddress(InternetAddress.loopbackIPv4),
0,
);
}
Expand Down

0 comments on commit 9aeb121

Please sign in to comment.