Skip to content

Commit

Permalink
refactor: use dart 3 pattern matching
Browse files Browse the repository at this point in the history
  • Loading branch information
ardera committed Jun 20, 2023
1 parent ed9bd23 commit 7f4a1d9
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 40 deletions.
22 changes: 8 additions & 14 deletions packages/linux_can/lib/src/data_classes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ abstract class CanFrame {
}
}

abstract class CanDataFrame extends CanFrame {
sealed class CanDataFrame extends CanFrame {
const CanDataFrame({required this.id, required this.data}) : assert(0 <= data.length && data.length <= 8);

/// CAN ID of the frame.
Expand All @@ -444,7 +444,7 @@ abstract class CanDataFrame extends CanFrame {
final List<int> data;
}

class CanStandardDataFrame extends CanDataFrame {
final class CanStandardDataFrame extends CanDataFrame {
const CanStandardDataFrame({required super.id, required super.data}) : assert(id & ~CAN_SFF_MASK == 0);

@override
Expand All @@ -456,7 +456,7 @@ class CanStandardDataFrame extends CanDataFrame {
int get hashCode => Object.hash(id.hashCode, data.hashCode);
}

class CanExtendedDataFrame extends CanDataFrame {
final class CanExtendedDataFrame extends CanDataFrame {
const CanExtendedDataFrame({required super.id, required super.data}) : assert(id & ~CAN_EFF_MASK == 0);

@override
Expand All @@ -468,14 +468,14 @@ class CanExtendedDataFrame extends CanDataFrame {
int get hashCode => Object.hash(id.hashCode, data.hashCode);
}

abstract class CanRemoteFrame extends CanFrame {
sealed class CanRemoteFrame extends CanFrame {
const CanRemoteFrame({required this.id});

/// CAN ID of the frame.
final int id;
}

class CanStandardRemoteFrame extends CanRemoteFrame {
final class CanStandardRemoteFrame extends CanRemoteFrame {
const CanStandardRemoteFrame({required super.id}) : assert(id & ~CAN_SFF_MASK == 0);

@override
Expand All @@ -487,7 +487,7 @@ class CanStandardRemoteFrame extends CanRemoteFrame {
int get hashCode => id.hashCode;
}

class CanExtendedRemoteFrame extends CanRemoteFrame {
final class CanExtendedRemoteFrame extends CanRemoteFrame {
const CanExtendedRemoteFrame({required super.id}) : assert(id & ~CAN_EFF_MASK == 0);

@override
Expand All @@ -499,14 +499,8 @@ class CanExtendedRemoteFrame extends CanRemoteFrame {
int get hashCode => id.hashCode;
}

class CanErrorFrame extends CanFrame {
/// The fact that we only have one instance of this means we don't need to implement
/// operator ==() and hashCode().
const CanErrorFrame._();

factory CanErrorFrame() {
return const CanErrorFrame._();
}
final class CanErrorFrame extends CanFrame {
const CanErrorFrame();
}

/// The RFC2863 state of the network interface.
Expand Down
48 changes: 22 additions & 26 deletions packages/linux_can/lib/src/platform_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -426,32 +426,28 @@ class PlatformInterface {

final nativeFrame = ffi.calloc<can_frame>();

if (frame is CanDataFrame) {
nativeFrame.ref.can_id = frame.id;
if (frame is CanExtendedDataFrame) {
nativeFrame.ref.can_id |= CAN_EFF_FLAG;
}

assert(frame.data.length <= 8);

nativeFrame.ref.len = frame.data.length;
_writeBytesToArray(
frame.data,
8,
(index, value) => nativeFrame.ref.data[index] = value,
);
} else if (frame is CanRemoteFrame) {
nativeFrame.ref.can_id = frame.id;
if (frame is CanExtendedRemoteFrame) {
nativeFrame.ref.can_id |= CAN_EFF_FLAG;
}
nativeFrame.ref.can_id |= CAN_RTR_FLAG;

nativeFrame.ref.len = 0;
} else if (frame is CanErrorFrame) {
nativeFrame.ref.can_id |= CAN_ERR_FLAG;

nativeFrame.ref.len = 0;
switch (frame) {
case CanDataFrame(data: var data):
nativeFrame.ref.can_id = switch (frame) {
CanStandardDataFrame(id: var id) => id,
CanExtendedDataFrame(id: var id) => id | CAN_EFF_FLAG,
};

nativeFrame.ref.len = frame.data.length;
_writeBytesToArray(
data,
8,
(index, value) => nativeFrame.ref.data[index] = value,
);
case CanRemoteFrame _:
nativeFrame.ref.can_id = switch (frame) {
CanStandardRemoteFrame(id: var id) => id | CAN_RTR_FLAG,
CanExtendedRemoteFrame(id: var id) => id | CAN_RTR_FLAG | CAN_EFF_FLAG,
};
nativeFrame.ref.len = 0;
case CanErrorFrame _:
nativeFrame.ref.can_id = CAN_ERR_FLAG;
nativeFrame.ref.len = 0;
}

/// TODO: use sendmsg and MSG_DONTWAIT for non-blocking sends, and make blocking sends block in the kernel
Expand Down

0 comments on commit 7f4a1d9

Please sign in to comment.