Skip to content

Commit d10b22a

Browse files
committed
feat(nextcloud)!: webdav deserialize duration fields
Signed-off-by: Nikolas Rimikis <leptopoda@users.noreply.github.com>
1 parent d49c27c commit d10b22a

File tree

5 files changed

+85
-16
lines changed

5 files changed

+85
-16
lines changed

packages/nextcloud/generate_props.dart

+5-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void main() {
3737
'lock-owner-editor': 'String',
3838
'lock-owner-type': 'int',
3939
'lock-time': 'unixEpoch',
40-
'lock-timeout': 'int',
40+
'lock-timeout': 'seconds',
4141
'lock-token': 'String',
4242
'metadata_etag': 'String',
4343
'mount-type': 'String',
@@ -102,6 +102,9 @@ void main() {
102102
case 'unixEpoch':
103103
value.writeln(' @UnixEpochXMLConverter()');
104104
type = 'tz.TZDateTime';
105+
case 'seconds':
106+
value.writeln(' @DurationXMLConverter()');
107+
type = 'Duration';
105108
}
106109

107110
value.write(' final $type? $variable;');
@@ -124,6 +127,7 @@ void main() {
124127
'// coverage:ignore-file',
125128
"import 'package:meta/meta.dart';",
126129
"import 'package:nextcloud/src/utils/date_time.dart';",
130+
"import 'package:nextcloud/src/webdav/utils.dart';",
127131
"import 'package:nextcloud/src/webdav/webdav.dart';",
128132
"import 'package:timezone/timezone.dart' as tz;",
129133
"import 'package:xml/xml.dart';",

packages/nextcloud/lib/src/webdav/props.dart

+5-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// coverage:ignore-file
33
import 'package:meta/meta.dart';
44
import 'package:nextcloud/src/utils/date_time.dart';
5+
import 'package:nextcloud/src/webdav/utils.dart';
56
import 'package:nextcloud/src/webdav/webdav.dart';
67
import 'package:timezone/timezone.dart' as tz;
78
import 'package:xml/xml.dart';
@@ -938,7 +939,8 @@ class WebDavProp with _$WebDavPropXmlSerializableMixin {
938939
namespace: namespaceNextcloud,
939940
includeIfNull: false,
940941
)
941-
final int? ncLockTimeout;
942+
@DurationXMLConverter()
943+
final Duration? ncLockTimeout;
942944

943945
@annotation.XmlElement(
944946
name: 'lock-token',
@@ -1418,7 +1420,8 @@ class WebDavOcFilterRules with _$WebDavOcFilterRulesXmlSerializableMixin {
14181420
namespace: namespaceNextcloud,
14191421
includeIfNull: false,
14201422
)
1421-
final int? ncLockTimeout;
1423+
@DurationXMLConverter()
1424+
final Duration? ncLockTimeout;
14221425

14231426
@annotation.XmlElement(
14241427
name: 'lock-token',

packages/nextcloud/lib/src/webdav/props.g.dart

+16-12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/nextcloud/lib/src/webdav/utils.dart

+58
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import 'package:meta/meta.dart';
77
import 'package:nextcloud/src/webdav/models.dart';
88
import 'package:nextcloud/src/webdav/path_uri.dart';
99
import 'package:nextcloud/src/webdav/webdav.dart';
10+
import 'package:xml/xml.dart' as xml;
11+
import 'package:xml_annotation/xml_annotation.dart' as xml_annotation;
1012

1113
/// Base path used on the server
1214
final webdavBase = PathUri.parse('/remote.php/webdav');
@@ -47,3 +49,59 @@ final class WebDavResponseConverter with Converter<http.StreamedResponse, Future
4749
return WebDavMultistatus.fromXmlElement(xml!);
4850
}
4951
}
52+
53+
@internal
54+
final class DurationXMLConverter implements xml_annotation.XmlConverter<Duration?> {
55+
const DurationXMLConverter();
56+
57+
@override
58+
void buildXmlChildren(
59+
Duration? instance,
60+
xml.XmlBuilder builder, {
61+
Map<String, String> namespaces = const {},
62+
}) {
63+
if (instance == null) {
64+
return;
65+
}
66+
67+
final serialized = instance.inSeconds.toString();
68+
builder.text(serialized);
69+
}
70+
71+
@override
72+
Duration? fromXmlElement(
73+
xml.XmlElement element,
74+
) {
75+
final value = element.getText();
76+
77+
if (value != null) {
78+
final seconds = int.parse(value);
79+
return Duration(seconds: seconds);
80+
}
81+
82+
return null;
83+
}
84+
85+
@override
86+
List<xml.XmlAttribute> toXmlAttributes(
87+
Duration? instance, {
88+
Map<String, String?> namespaces = const {},
89+
}) {
90+
return const <xml.XmlAttribute>[];
91+
}
92+
93+
@override
94+
List<xml.XmlNode> toXmlChildren(
95+
Duration? instance, {
96+
Map<String, String?> namespaces = const {},
97+
}) {
98+
if (instance == null) {
99+
return const <xml.XmlNode>[];
100+
}
101+
102+
final serialized = instance.inSeconds.toString();
103+
return <xml.XmlNode>[
104+
xml.XmlText(serialized),
105+
];
106+
}
107+
}

packages/nextcloud/lib/webdav.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export 'src/webdav/file.dart';
77
export 'src/webdav/models.dart';
88
export 'src/webdav/path_uri.dart';
99
export 'src/webdav/props.dart';
10-
export 'src/webdav/utils.dart' hide constructUri;
10+
export 'src/webdav/utils.dart' hide DurationXMLConverter, constructUri;
1111
export 'src/webdav/webdav.dart';
1212

1313
// ignore: public_member_api_docs

0 commit comments

Comments
 (0)