Skip to content

Commit

Permalink
refactor: refactor parsing of interaction affordances
Browse files Browse the repository at this point in the history
  • Loading branch information
JKRhb committed Sep 26, 2022
1 parent af4ef20 commit 5355557
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 56 deletions.
116 changes: 116 additions & 0 deletions lib/src/definitions/extensions/json_parser.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@ import 'package:curie/curie.dart';

import '../data_schema.dart';
import '../form.dart';
import '../interaction_affordances/action.dart';
import '../interaction_affordances/event.dart';
import '../interaction_affordances/interaction_affordance.dart';
import '../interaction_affordances/property.dart';
import '../link.dart';
import '../security/security_scheme.dart';
import '../thing_description.dart';
import '../validation/validation_exception.dart';

/// Extension for parsing fields of JSON objects.
Expand Down Expand Up @@ -198,4 +203,115 @@ extension ParseField on Map<String, dynamic> {
.map(Link.fromJson)
.toList();
}

/// Parses [SecurityScheme]s contained in this JSON object.
///
/// Adds the key `securityDefinitions` to the set of [parsedFields], if
/// defined.
Map<String, SecurityScheme>? parseSecurityDefinitions(
PrefixMapping prefixMapping, [
Set<String>? parsedFields,
]) {
final fieldValue =
parseMapField<dynamic>('securityDefinitions', parsedFields);

if (fieldValue == null) {
return null;
}

final Map<String, SecurityScheme> result = {};

for (final securityDefinition in fieldValue.entries) {
final dynamic value = securityDefinition.value;
if (value is Map<String, dynamic>) {
final securityScheme = SecurityScheme.fromJson(value);
if (securityScheme != null) {
result[securityDefinition.key] = securityScheme;
}
}
}

return result;
}

/// Parses [Property]s contained in this JSON object.
///
/// Adds the key `properties` to the set of [parsedFields], if defined.
Map<String, Property>? parseProperties(
ThingDescription thingDescription,
PrefixMapping prefixMapping, [
Set<String>? parsedFields,
]) {
final fieldValue = parseMapField<dynamic>('properties', parsedFields);

if (fieldValue == null) {
return null;
}

final Map<String, Property> result = {};

for (final property in fieldValue.entries) {
final dynamic value = property.value;
if (value is Map<String, dynamic>) {
result[property.key] =
Property.fromJson(value, thingDescription, prefixMapping);
}
}

return result;
}

/// Parses [Action]s contained in this JSON object.
///
/// Adds the key `actions` to the set of [parsedFields], if defined.
Map<String, Action>? parseActions(
ThingDescription thingDescription,
PrefixMapping prefixMapping, [
Set<String>? parsedFields,
]) {
final fieldValue = parseMapField<dynamic>('actions', parsedFields);

if (fieldValue == null) {
return null;
}

final Map<String, Action> result = {};

for (final property in fieldValue.entries) {
final dynamic value = property.value;
if (value is Map<String, dynamic>) {
result[property.key] =
Action.fromJson(value, thingDescription, prefixMapping);
}
}

return result;
}

/// Parses [Event]s contained in this JSON object.
///
/// Adds the key `events` to the set of [parsedFields], if defined.
Map<String, Event>? parseEvents(
ThingDescription thingDescription,
PrefixMapping prefixMapping, [
Set<String>? parsedFields,
]) {
final fieldValue = parseMapField<dynamic>('events', parsedFields);

if (fieldValue == null) {
return null;
}

final Map<String, Event> result = {};

for (final property in fieldValue.entries) {
final dynamic value = property.value;
if (value is Map<String, dynamic>) {
result[property.key] =
Event.fromJson(value, thingDescription, prefixMapping);
}
}

return result;
}
}
62 changes: 6 additions & 56 deletions lib/src/definitions/thing_description.dart
Original file line number Diff line number Diff line change
Expand Up @@ -139,66 +139,16 @@ class ThingDescription {
security
.addAll(json.parseArrayField<String>('security', parsedFields) ?? []);

final dynamic securityDefinitions = json['securityDefinitions'];
if (securityDefinitions is Map<String, dynamic>) {
_parseSecurityDefinitions(securityDefinitions);
}
securityDefinitions.addAll(
json.parseSecurityDefinitions(prefixMapping, parsedFields) ?? {},
);

uriVariables = json.parseMapField<dynamic>('uriVariables');

final dynamic properties = json['properties'];
if (properties is Map<String, dynamic>) {
_parseProperties(properties);
}
final dynamic actions = json['actions'];
if (actions is Map<String, dynamic>) {
_parseActions(actions);
}
final dynamic events = json['events'];
if (events is Map<String, dynamic>) {
_parseEvents(events);
}
properties.addAll(json.parseProperties(this, prefixMapping) ?? {});
actions.addAll(json.parseActions(this, prefixMapping) ?? {});
events.addAll(json.parseEvents(this, prefixMapping) ?? {});

links.addAll(json.parseLinks(prefixMapping) ?? []);
}

void _parseProperties(Map<String, dynamic> json) {
for (final property in json.entries) {
final dynamic value = property.value;
if (value is Map<String, dynamic>) {
properties[property.key] =
Property.fromJson(value, this, prefixMapping);
}
}
}

void _parseActions(Map<String, dynamic> json) {
for (final action in json.entries) {
final dynamic value = action.value;
if (value is Map<String, dynamic>) {
actions[action.key] = Action.fromJson(value, this, prefixMapping);
}
}
}

void _parseEvents(Map<String, dynamic> json) {
for (final event in json.entries) {
final dynamic value = event.value;
if (value is Map<String, dynamic>) {
events[event.key] = Event.fromJson(value, this, prefixMapping);
}
}
}

void _parseSecurityDefinitions(Map<String, dynamic> json) {
for (final securityDefinition in json.entries) {
final dynamic value = securityDefinition.value;
if (value is Map<String, dynamic>) {
final securityScheme = SecurityScheme.fromJson(value);
if (securityScheme != null) {
securityDefinitions[securityDefinition.key] = securityScheme;
}
}
}
}
}

0 comments on commit 5355557

Please sign in to comment.