зеркало из https://github.com/mozilla/toodle.git
Basic objects for to-do list project and their rust counterparts accessed from iOS
Fully functioning login flow for todolist.
This commit is contained in:
Родитель
53f90ea7b8
Коммит
14d08ee472
|
@ -0,0 +1,73 @@
|
||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Mac",
|
||||||
|
"includePath": [
|
||||||
|
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1",
|
||||||
|
"/usr/local/include",
|
||||||
|
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include",
|
||||||
|
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
|
||||||
|
"/usr/include",
|
||||||
|
"${workspaceRoot}"
|
||||||
|
],
|
||||||
|
"defines": [],
|
||||||
|
"intelliSenseMode": "clang-x64",
|
||||||
|
"browse": {
|
||||||
|
"path": [
|
||||||
|
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1",
|
||||||
|
"/usr/local/include",
|
||||||
|
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include",
|
||||||
|
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
|
||||||
|
"/usr/include",
|
||||||
|
"${workspaceRoot}"
|
||||||
|
],
|
||||||
|
"limitSymbolsToIncludedHeaders": true,
|
||||||
|
"databaseFilename": ""
|
||||||
|
},
|
||||||
|
"macFrameworkPath": [
|
||||||
|
"/System/Library/Frameworks",
|
||||||
|
"/Library/Frameworks"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Linux",
|
||||||
|
"includePath": [
|
||||||
|
"/usr/include",
|
||||||
|
"/usr/local/include",
|
||||||
|
"${workspaceRoot}"
|
||||||
|
],
|
||||||
|
"defines": [],
|
||||||
|
"intelliSenseMode": "clang-x64",
|
||||||
|
"browse": {
|
||||||
|
"path": [
|
||||||
|
"/usr/include",
|
||||||
|
"/usr/local/include",
|
||||||
|
"${workspaceRoot}"
|
||||||
|
],
|
||||||
|
"limitSymbolsToIncludedHeaders": true,
|
||||||
|
"databaseFilename": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Win32",
|
||||||
|
"includePath": [
|
||||||
|
"C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include",
|
||||||
|
"${workspaceRoot}"
|
||||||
|
],
|
||||||
|
"defines": [
|
||||||
|
"_DEBUG",
|
||||||
|
"UNICODE"
|
||||||
|
],
|
||||||
|
"intelliSenseMode": "msvc-x64",
|
||||||
|
"browse": {
|
||||||
|
"path": [
|
||||||
|
"C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include/*",
|
||||||
|
"${workspaceRoot}"
|
||||||
|
],
|
||||||
|
"limitSymbolsToIncludedHeaders": true,
|
||||||
|
"databaseFilename": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": 3
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"array": "cpp",
|
||||||
|
"iterator": "cpp",
|
||||||
|
"string": "cpp",
|
||||||
|
"vector": "cpp"
|
||||||
|
}
|
||||||
|
}
|
|
@ -37,7 +37,7 @@
|
||||||
<ConfirmationsSetting value="0" id="Add" />
|
<ConfirmationsSetting value="0" id="Add" />
|
||||||
<ConfirmationsSetting value="0" id="Remove" />
|
<ConfirmationsSetting value="0" id="Remove" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectType">
|
<component name="ProjectType">
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
7B668C701F46E040001A9945 /* libgreetings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B668C6F1F46E040001A9945 /* libgreetings.a */; };
|
7B668C701F46E040001A9945 /* libgreetings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B668C6F1F46E040001A9945 /* libgreetings.a */; };
|
||||||
7B668C721F46E04B001A9945 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B668C711F46E04B001A9945 /* libresolv.tbd */; };
|
7B668C721F46E04B001A9945 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B668C711F46E04B001A9945 /* libresolv.tbd */; };
|
||||||
7B668C7B1F46E26F001A9945 /* RustGreetings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B668C7A1F46E26F001A9945 /* RustGreetings.swift */; };
|
7B668C7B1F46E26F001A9945 /* RustGreetings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B668C7A1F46E26F001A9945 /* RustGreetings.swift */; };
|
||||||
|
7B9F01331F7D15E2000407E5 /* NSLayoutConstraint+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B9F01321F7D15E2000407E5 /* NSLayoutConstraint+Utils.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
@ -44,6 +45,7 @@
|
||||||
7B668C741F46E084001A9945 /* Greetings-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Greetings-Bridging-Header.h"; sourceTree = "<group>"; };
|
7B668C741F46E084001A9945 /* Greetings-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Greetings-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
7B668C791F46E0F4001A9945 /* greetings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = greetings.h; path = ../../../cargo/src/greetings.h; sourceTree = "<group>"; };
|
7B668C791F46E0F4001A9945 /* greetings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = greetings.h; path = ../../../cargo/src/greetings.h; sourceTree = "<group>"; };
|
||||||
7B668C7A1F46E26F001A9945 /* RustGreetings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RustGreetings.swift; sourceTree = "<group>"; };
|
7B668C7A1F46E26F001A9945 /* RustGreetings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RustGreetings.swift; sourceTree = "<group>"; };
|
||||||
|
7B9F01321F7D15E2000407E5 /* NSLayoutConstraint+Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSLayoutConstraint+Utils.swift"; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
@ -95,6 +97,7 @@
|
||||||
7B668C551F46E022001A9945 /* Assets.xcassets */,
|
7B668C551F46E022001A9945 /* Assets.xcassets */,
|
||||||
7B668C571F46E022001A9945 /* LaunchScreen.storyboard */,
|
7B668C571F46E022001A9945 /* LaunchScreen.storyboard */,
|
||||||
7B668C5A1F46E022001A9945 /* Info.plist */,
|
7B668C5A1F46E022001A9945 /* Info.plist */,
|
||||||
|
7B9F01321F7D15E2000407E5 /* NSLayoutConstraint+Utils.swift */,
|
||||||
);
|
);
|
||||||
path = Greetings;
|
path = Greetings;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -172,17 +175,19 @@
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastSwiftUpdateCheck = 0830;
|
LastSwiftUpdateCheck = 0830;
|
||||||
LastUpgradeCheck = 0830;
|
LastUpgradeCheck = 0900;
|
||||||
ORGANIZATIONNAME = Mozilla;
|
ORGANIZATIONNAME = Mozilla;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
7B668C4A1F46E022001A9945 = {
|
7B668C4A1F46E022001A9945 = {
|
||||||
CreatedOnToolsVersion = 8.3.3;
|
CreatedOnToolsVersion = 8.3.3;
|
||||||
DevelopmentTeam = 8BHJ767F4Y;
|
DevelopmentTeam = 8BHJ767F4Y;
|
||||||
|
LastSwiftMigration = 0900;
|
||||||
ProvisioningStyle = Automatic;
|
ProvisioningStyle = Automatic;
|
||||||
};
|
};
|
||||||
7B668C5E1F46E022001A9945 = {
|
7B668C5E1F46E022001A9945 = {
|
||||||
CreatedOnToolsVersion = 8.3.3;
|
CreatedOnToolsVersion = 8.3.3;
|
||||||
DevelopmentTeam = 8BHJ767F4Y;
|
DevelopmentTeam = 8BHJ767F4Y;
|
||||||
|
LastSwiftMigration = 0900;
|
||||||
ProvisioningStyle = Automatic;
|
ProvisioningStyle = Automatic;
|
||||||
TestTargetID = 7B668C4A1F46E022001A9945;
|
TestTargetID = 7B668C4A1F46E022001A9945;
|
||||||
};
|
};
|
||||||
|
@ -233,6 +238,7 @@
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
7B668C7B1F46E26F001A9945 /* RustGreetings.swift in Sources */,
|
7B668C7B1F46E26F001A9945 /* RustGreetings.swift in Sources */,
|
||||||
|
7B9F01331F7D15E2000407E5 /* NSLayoutConstraint+Utils.swift in Sources */,
|
||||||
7B668C511F46E022001A9945 /* ViewController.swift in Sources */,
|
7B668C511F46E022001A9945 /* ViewController.swift in Sources */,
|
||||||
7B668C4F1F46E022001A9945 /* AppDelegate.swift in Sources */,
|
7B668C4F1F46E022001A9945 /* AppDelegate.swift in Sources */,
|
||||||
);
|
);
|
||||||
|
@ -286,7 +292,9 @@
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
@ -294,7 +302,11 @@
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
@ -337,7 +349,9 @@
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
@ -345,7 +359,11 @@
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
@ -382,7 +400,8 @@
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.mozilla.Greetings;
|
PRODUCT_BUNDLE_IDENTIFIER = com.mozilla.Greetings;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/Greetings/Greetings-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/Greetings/Greetings-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 3.0;
|
SWIFT_SWIFT3_OBJC_INFERENCE = On;
|
||||||
|
SWIFT_VERSION = 4.0;
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
|
@ -397,7 +416,8 @@
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.mozilla.Greetings;
|
PRODUCT_BUNDLE_IDENTIFIER = com.mozilla.Greetings;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/Greetings/Greetings-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/Greetings/Greetings-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 3.0;
|
SWIFT_SWIFT3_OBJC_INFERENCE = On;
|
||||||
|
SWIFT_VERSION = 4.0;
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
@ -411,7 +431,8 @@
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.mozilla.GreetingsTests;
|
PRODUCT_BUNDLE_IDENTIFIER = com.mozilla.GreetingsTests;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 3.0;
|
SWIFT_SWIFT3_OBJC_INFERENCE = On;
|
||||||
|
SWIFT_VERSION = 4.0;
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Greetings.app/Greetings";
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Greetings.app/Greetings";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
|
@ -426,7 +447,8 @@
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.mozilla.GreetingsTests;
|
PRODUCT_BUNDLE_IDENTIFIER = com.mozilla.GreetingsTests;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 3.0;
|
SWIFT_SWIFT3_OBJC_INFERENCE = On;
|
||||||
|
SWIFT_VERSION = 4.0;
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Greetings.app/Greetings";
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Greetings.app/Greetings";
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
|
@ -450,6 +472,7 @@
|
||||||
7B668C6A1F46E022001A9945 /* Release */,
|
7B668C6A1F46E022001A9945 /* Release */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
7B668C6B1F46E022001A9945 /* Build configuration list for PBXNativeTarget "GreetingsTests" */ = {
|
7B668C6B1F46E022001A9945 /* Build configuration list for PBXNativeTarget "GreetingsTests" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
|
@ -458,6 +481,7 @@
|
||||||
7B668C6D1F46E022001A9945 /* Release */,
|
7B668C6D1F46E022001A9945 /* Release */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
//
|
||||||
|
// NSLayoutConstraint+Utils.swift
|
||||||
|
// Greetings
|
||||||
|
//
|
||||||
|
// Created by Emily Toop on 28/09/2017.
|
||||||
|
// Copyright © 2017 Mozilla. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
extension NSLayoutConstraint {
|
||||||
|
open class func activate(_ constraints: [NSLayoutConstraint], translatesAutoresizingMaskIntoConstraints: Bool) {
|
||||||
|
for constraint in constraints {
|
||||||
|
if let view = constraint.firstItem as? UIView {
|
||||||
|
view.translatesAutoresizingMaskIntoConstraints = translatesAutoresizingMaskIntoConstraints
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NSLayoutConstraint.activate(constraints)
|
||||||
|
}
|
||||||
|
}
|
|
@ -110,14 +110,3 @@ class ViewController: UIViewController {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension NSLayoutConstraint {
|
|
||||||
open class func activate(_ constraints: [NSLayoutConstraint], translatesAutoresizingMaskIntoConstraints: Bool) {
|
|
||||||
for constraint in constraints {
|
|
||||||
if let view = constraint.firstItem as? UIView {
|
|
||||||
view.translatesAutoresizingMaskIntoConstraints = translatesAutoresizingMaskIntoConstraints
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NSLayoutConstraint.activate(constraints)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,10 @@ name = "greetings"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"jni 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"jni 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libsqlite3-sys 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rusqlite 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"uuid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -10,6 +14,16 @@ name = "ascii"
|
||||||
version = "0.7.1"
|
version = "0.7.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "0.7.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "0.9.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "byteorder"
|
name = "byteorder"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
@ -34,6 +48,27 @@ name = "error-chain"
|
||||||
version = "0.10.0"
|
version = "0.10.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fuchsia-zircon"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fuchsia-zircon-sys"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gcc"
|
||||||
|
version = "0.3.54"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jni"
|
name = "jni"
|
||||||
version = "0.5.2"
|
version = "0.5.2"
|
||||||
|
@ -51,17 +86,137 @@ name = "jni-sys"
|
||||||
version = "0.2.5"
|
version = "0.2.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "kernel32-sys"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libsqlite3-sys"
|
||||||
|
version = "0.8.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "linked-hash-map"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.3.8"
|
version = "0.3.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lru-cache"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pkg-config"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.3.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "redox_syscall"
|
||||||
|
version = "0.1.31"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rusqlite"
|
||||||
|
version = "0.12.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libsqlite3-sys 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "time"
|
||||||
|
version = "0.1.38"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "uuid"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"rand 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "vcpkg"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi"
|
||||||
|
version = "0.2.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-build"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
"checksum ascii 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae7d751998c189c1d4468cf0a39bb2eae052a9c58d50ebb3b9591ee3813ad50"
|
"checksum ascii 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae7d751998c189c1d4468cf0a39bb2eae052a9c58d50ebb3b9591ee3813ad50"
|
||||||
|
"checksum bitflags 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab1c7dc97f39523ffa63f3096291612e630cf3ed75aa6b9fad436bac4c700274"
|
||||||
|
"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
|
||||||
"checksum byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff81738b726f5d099632ceaffe7fb65b90212e8dce59d518729e7e8634032d3d"
|
"checksum byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff81738b726f5d099632ceaffe7fb65b90212e8dce59d518729e7e8634032d3d"
|
||||||
"checksum cesu8 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
|
"checksum cesu8 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
|
||||||
"checksum combine 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c279781ad7b9b480fe265770ea5cb87fcbdc8ea1b2b6930d60a206e781dc6c"
|
"checksum combine 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c279781ad7b9b480fe265770ea5cb87fcbdc8ea1b2b6930d60a206e781dc6c"
|
||||||
"checksum error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9435d864e017c3c6afeac1654189b06cdb491cf2ff73dbf0d73b0f292f42ff8"
|
"checksum error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9435d864e017c3c6afeac1654189b06cdb491cf2ff73dbf0d73b0f292f42ff8"
|
||||||
|
"checksum fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f6c0581a4e363262e52b87f59ee2afe3415361c6ec35e665924eb08afe8ff159"
|
||||||
|
"checksum fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "43f3795b4bae048dc6123a6b972cadde2e676f9ded08aef6bb77f5f157684a82"
|
||||||
|
"checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb"
|
||||||
"checksum jni 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "914c602e3a81f89761661fca05eb0e1f1834985aeae4074394e030c4181cfa07"
|
"checksum jni 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "914c602e3a81f89761661fca05eb0e1f1834985aeae4074394e030c4181cfa07"
|
||||||
"checksum jni-sys 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "de0aaaba8809ab8d83a53fe2b313b996b79e8632b855eae9f70ad4323dca91b8"
|
"checksum jni-sys 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "de0aaaba8809ab8d83a53fe2b313b996b79e8632b855eae9f70ad4323dca91b8"
|
||||||
|
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
||||||
|
"checksum libc 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)" = "56cce3130fd040c28df6f495c8492e5ec5808fb4c9093c310df02b0c8f030148"
|
||||||
|
"checksum libsqlite3-sys 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "370090ad578ba845a3ad4f383ceb3deba7abd51ab1915ad1f2c982cc6035e31c"
|
||||||
|
"checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939"
|
||||||
"checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"
|
"checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"
|
||||||
|
"checksum lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d06ff7ff06f729ce5f4e227876cb88d10bc59cd4ae1e09fbb2bde15c850dc21"
|
||||||
|
"checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
|
||||||
|
"checksum rand 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "61efcbcd9fa8d8fbb07c84e34a8af18a1ff177b449689ad38a6e9457ecc7b2ae"
|
||||||
|
"checksum redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "8dde11f18c108289bef24469638a04dce49da56084f2d50618b226e47eb04509"
|
||||||
|
"checksum rusqlite 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffaf393ccdac5580092a4d8eb2edffbffe9a8c4484c62d8a0fcac99bc3718566"
|
||||||
|
"checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520"
|
||||||
|
"checksum uuid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7cfec50b0842181ba6e713151b72f4ec84a6a7e2c9c8a8a3ffc37bb1cd16b231"
|
||||||
|
"checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b"
|
||||||
|
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
||||||
|
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
|
||||||
|
|
|
@ -11,3 +11,13 @@ jni = { version = "0.5", default-features = false }
|
||||||
[lib]
|
[lib]
|
||||||
name = "greetings"
|
name = "greetings"
|
||||||
crate-type = ["staticlib", "cdylib"]
|
crate-type = ["staticlib", "cdylib"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
time = "0.1.38"
|
||||||
|
libsqlite3-sys = "0.8.1"
|
||||||
|
uuid = { version = "0.4", features = ["v4"] }
|
||||||
|
|
||||||
|
[dependencies.rusqlite]
|
||||||
|
version = "0.12"
|
||||||
|
# System sqlite might be very old.
|
||||||
|
features = ["bundled", "limits"]
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
#ifndef categories_h
|
||||||
|
#define categories_h
|
||||||
|
|
||||||
|
#import "items.h"
|
||||||
|
|
||||||
|
struct category;
|
||||||
|
struct item;
|
||||||
|
|
||||||
|
struct category** get_all_categories();
|
||||||
|
const size_t category_list_count(const struct category** list);
|
||||||
|
const void category_list_destroy(const struct category** list);
|
||||||
|
|
||||||
|
struct category* category_new(char* name);
|
||||||
|
const void category_destroy(const struct category* category);
|
||||||
|
const size_t category_get_id(const struct category* category);
|
||||||
|
const char* category_get_name(const struct category* category);
|
||||||
|
struct item** category_get_items(const struct category* category);
|
||||||
|
const size_t category_items_count(const struct category* category);
|
||||||
|
|
||||||
|
#endif /* categories_h */
|
|
@ -0,0 +1,82 @@
|
||||||
|
use std::os::raw::{c_char, c_int};
|
||||||
|
|
||||||
|
use items::Item;
|
||||||
|
use utils::{c_char_to_string, string_to_c_char};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Category {
|
||||||
|
pub id: isize,
|
||||||
|
pub name: String,
|
||||||
|
pub items: Vec<Item>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Category {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
println!("{:?} is being deallocated", self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn category_new() -> *mut Category {
|
||||||
|
let category = Category{
|
||||||
|
id: 0,
|
||||||
|
name: "Open items".to_string(),
|
||||||
|
items: Vec::new(),
|
||||||
|
};
|
||||||
|
let boxed_category = Box::new(category);
|
||||||
|
Box::into_raw(boxed_category)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn category_destroy(category: *mut Category) {
|
||||||
|
let _ = Box::from_raw(category);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn category_get_id(category: *const Category) -> c_int {
|
||||||
|
let category = &*category;
|
||||||
|
category.id as c_int
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn category_get_name(category: *const Category) -> *mut c_char {
|
||||||
|
let category = &*category;
|
||||||
|
string_to_c_char(category.name.clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn category_get_items(category: *const Category) -> *mut Vec<Item> {
|
||||||
|
let category = &*category;
|
||||||
|
let boxed_items = Box::new(category.items.clone());
|
||||||
|
Box::into_raw(boxed_items)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn category_items_count(category: *const Category) -> c_int {
|
||||||
|
let category = &*category;
|
||||||
|
category.items.len() as c_int
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn get_all_categories() -> *mut Vec<Category> {
|
||||||
|
let mut category_list = Vec::new();
|
||||||
|
let category = Category{
|
||||||
|
id: 0,
|
||||||
|
name: "Open items".to_string(),
|
||||||
|
items: Vec::new(),
|
||||||
|
};
|
||||||
|
category_list.push(category);
|
||||||
|
let boxed_list = Box::new(category_list);
|
||||||
|
Box::into_raw(boxed_list)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn category_list_destroy(category_list: *mut Vec<Category>) {
|
||||||
|
let _ = Box::from_raw(category_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn category_list_count(category_list: *const Vec<Category>) -> c_int {
|
||||||
|
let category_list = &*category_list;
|
||||||
|
category_list.len() as c_int
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "logins.h"
|
||||||
|
|
||||||
|
struct store;
|
||||||
|
|
||||||
|
struct store* new_store(const char* uri);
|
||||||
|
void store_destroy(struct store* data);
|
||||||
|
|
||||||
|
struct login* create_login(const struct store* data, const char* username, const char* password);
|
||||||
|
const size_t validate_login(const struct store* store, const char* username, const char* password);
|
|
@ -0,0 +1,135 @@
|
||||||
|
use std::os::raw::{c_char, c_int};
|
||||||
|
use std::sync::{Arc};
|
||||||
|
|
||||||
|
use rusqlite::Connection;
|
||||||
|
use rusqlite::Error;
|
||||||
|
use time::now_utc;
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
use logins::Login;
|
||||||
|
use utils::{c_char_to_string};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Store {
|
||||||
|
pub conn: Arc<Connection>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Store {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
println!("{:?} is being deallocated", self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Store {
|
||||||
|
pub fn new(uri: String) -> Self {
|
||||||
|
Store { conn: Arc::new(Connection::open(uri).unwrap()) }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_logins_table(&self) {
|
||||||
|
let sql = r#"CREATE TABLE IF NOT EXISTS logins (
|
||||||
|
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||||
|
username TEXT NOT NULL UNIQUE,
|
||||||
|
password TEXT NOT NULL,
|
||||||
|
guid TEXT NOT NULL,
|
||||||
|
time_created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
time_last_used DATETIME,
|
||||||
|
time_password_changed DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
times_used INTEGER DEFAULT 0
|
||||||
|
)"#;
|
||||||
|
self.conn.execute(sql, &[]).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn fetch_login(&self, username: String, password: String) -> Option<Login> {
|
||||||
|
let sql = r#"SELECT id, username, password, guid, time_created, time_last_used, time_password_changed, times_used
|
||||||
|
FROM logins
|
||||||
|
WHERE username=?
|
||||||
|
LIMIT 1"#;
|
||||||
|
let mut stmt = self.conn.prepare(sql).unwrap();
|
||||||
|
let mut login_iter = stmt.query_map(&[&username], |row| {
|
||||||
|
Login {
|
||||||
|
id: row.get(0),
|
||||||
|
username: row.get(1),
|
||||||
|
password: row.get(2),
|
||||||
|
guid: row.get(3),
|
||||||
|
time_created: row.get(4),
|
||||||
|
time_last_used: row.get(5),
|
||||||
|
time_password_changed: row.get(6),
|
||||||
|
times_used: row.get(7),
|
||||||
|
is_valid: 0
|
||||||
|
}
|
||||||
|
}).unwrap();
|
||||||
|
match login_iter.next() {
|
||||||
|
Some(result) => {
|
||||||
|
match result {
|
||||||
|
Ok(login) => {
|
||||||
|
let mut l = login;
|
||||||
|
if l.password != password {
|
||||||
|
l.is_valid = 2;
|
||||||
|
}
|
||||||
|
Some(l)
|
||||||
|
},
|
||||||
|
Err(err) => {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
None => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_login(&self, username: String, password: String) -> Option<Login> {
|
||||||
|
let sql = r#"INSERT INTO logins (username, password, guid, time_last_used, times_used) VALUES (?1, ?2, ?3, ?4, ?5)"#;
|
||||||
|
let time_last_used:Option<isize> = None;
|
||||||
|
let result = self.conn.execute(sql, &[&username, &password, &Uuid::new_v4().simple().to_string(), &time_last_used, &0]).unwrap();
|
||||||
|
self.fetch_login(username, password)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn new_store(uri: *const c_char) -> *mut Store {
|
||||||
|
let uri = c_char_to_string(uri);
|
||||||
|
let store = Store::new(uri);
|
||||||
|
// create logins table
|
||||||
|
store.create_logins_table();
|
||||||
|
Box::into_raw(Box::new(store))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn store_destroy(data: *mut Store) {
|
||||||
|
let _ = Box::from_raw(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn create_login(store: *const Store, username: *const c_char, password: *const c_char) -> *mut Login {
|
||||||
|
let uname = c_char_to_string(username);
|
||||||
|
let pword = c_char_to_string(password);
|
||||||
|
let store = &*store;
|
||||||
|
// let now = now_utc().to_timespec().sec as isize;
|
||||||
|
// let login = Box::new(Login{
|
||||||
|
// id: 0,
|
||||||
|
// username: uname,
|
||||||
|
// password: pword,
|
||||||
|
// guid: Uuid::new_v4().simple().to_string(),
|
||||||
|
// time_created: now.clone(),
|
||||||
|
// time_last_used: None,
|
||||||
|
// time_password_changed: now,
|
||||||
|
// times_used: 0,
|
||||||
|
// is_valid: 1
|
||||||
|
// });
|
||||||
|
let login = store.create_login(uname, pword).unwrap();
|
||||||
|
Box::into_raw(Box::new(login))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn validate_login(store: *const Store, username: *const c_char, password: *const c_char) -> c_int {
|
||||||
|
let uname = c_char_to_string(username);
|
||||||
|
let pword = c_char_to_string(password);
|
||||||
|
let store = &*store;
|
||||||
|
match store.fetch_login(uname, pword) {
|
||||||
|
Some(login) => login.is_valid as c_int,
|
||||||
|
None => 2 as c_int
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
const char* rust_greeting(const char* to);
|
|
||||||
void rust_greeting_free(char *);
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef items_h
|
||||||
|
#define items_h
|
||||||
|
|
||||||
|
struct item;
|
||||||
|
|
||||||
|
struct item* item_new();
|
||||||
|
const void item_destroy(const struct item* item);
|
||||||
|
|
||||||
|
#endif /* items_h */
|
|
@ -0,0 +1,30 @@
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Item {
|
||||||
|
pub id: isize,
|
||||||
|
pub description: String,
|
||||||
|
pub created_at: isize,
|
||||||
|
pub due_date: Option<isize>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Item {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
println!("{:?} is being deallocated", self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn item_new() -> *mut Item {
|
||||||
|
let item = Item{
|
||||||
|
id: 1,
|
||||||
|
description: "description".to_string(),
|
||||||
|
created_at: 0,
|
||||||
|
due_date: None,
|
||||||
|
};
|
||||||
|
let boxed_item = Box::new(item);
|
||||||
|
Box::into_raw(boxed_item)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn item_destroy(item: *mut Item) {
|
||||||
|
let _ = Box::from_raw(item);
|
||||||
|
}
|
|
@ -1,46 +1,13 @@
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
extern crate rusqlite;
|
||||||
|
extern crate time;
|
||||||
|
extern crate uuid;
|
||||||
|
|
||||||
use std::os::raw::{c_char};
|
pub mod logins;
|
||||||
use std::ffi::{CString, CStr};
|
pub mod categories;
|
||||||
|
pub mod items;
|
||||||
|
pub mod utils;
|
||||||
|
pub mod db;
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern fn rust_greeting(to: *const c_char) -> *mut c_char {
|
|
||||||
let c_str = unsafe { CStr::from_ptr(to) };
|
|
||||||
let recipient = match c_str.to_str() {
|
|
||||||
Err(_) => "there",
|
|
||||||
Ok(string) => string,
|
|
||||||
};
|
|
||||||
|
|
||||||
CString::new("Hello ".to_owned() + recipient).unwrap().into_raw()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern fn rust_greeting_free(s: *mut c_char) {
|
|
||||||
unsafe {
|
|
||||||
if s.is_null() { return }
|
|
||||||
CString::from_raw(s)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Expose the JNI interface for android below
|
|
||||||
#[cfg(target_os="android")]
|
|
||||||
#[allow(non_snake_case)]
|
|
||||||
pub mod android {
|
|
||||||
extern crate jni;
|
|
||||||
|
|
||||||
use super::*;
|
|
||||||
use self::jni::JNIEnv;
|
|
||||||
use self::jni::objects::{JClass, JString};
|
|
||||||
use self::jni::sys::{jstring};
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern fn Java_com_mozilla_greetings_RustGreetings_greeting(env: JNIEnv, _: JClass, java_pattern: JString) -> jstring {
|
|
||||||
let world = rust_greeting(env.get_string(java_pattern).expect("invalid pattern string").as_ptr());
|
|
||||||
let output = env.new_string(CStr::from_ptr(world).to_str().unwrap()).expect("Couldn't create java string!");
|
|
||||||
rust_greeting_free(world);
|
|
||||||
|
|
||||||
output.into_inner()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
struct login;
|
||||||
|
|
||||||
|
void login_destroy(struct login* data);
|
||||||
|
|
||||||
|
// Accessors for Login properties
|
||||||
|
const size_t login_get_id(const struct login* data);
|
||||||
|
const char* login_get_username(const struct login* data);
|
||||||
|
const char* login_get_password(const struct login* data);
|
||||||
|
const char* login_get_guid(const struct login* data);
|
||||||
|
const void login_set_guid(struct login* data, char* guid);
|
||||||
|
const size_t login_get_time_created(const struct login* data);
|
||||||
|
const size_t login_get_time_last_used(const struct login* data);
|
||||||
|
const size_t login_get_time_password_changed(const struct login* data);
|
||||||
|
const size_t login_get_times_used(const struct login* data);
|
||||||
|
const size_t login_is_valid(const struct login* data);
|
|
@ -0,0 +1,105 @@
|
||||||
|
use std::os::raw::{c_char, c_int};
|
||||||
|
|
||||||
|
use time::Timespec;
|
||||||
|
|
||||||
|
use utils::{c_char_to_string, string_to_c_char};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Login {
|
||||||
|
pub id: isize,
|
||||||
|
pub username: String,
|
||||||
|
pub password: String,
|
||||||
|
pub guid: String,
|
||||||
|
pub time_created: Timespec,
|
||||||
|
pub time_last_used: Option<Timespec>,
|
||||||
|
pub time_password_changed: Timespec,
|
||||||
|
pub times_used: isize,
|
||||||
|
pub is_valid: isize
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Login {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
println!("{:?} is being deallocated", self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Login {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn login_destroy(data: *mut Login) {
|
||||||
|
// Convert a *mut Login back into a Box<Login>.
|
||||||
|
// This function is unsafe because the Rust compiler can't know
|
||||||
|
// whether data is actually pointing to a boxed Login.
|
||||||
|
//
|
||||||
|
// Note that we don't actually have to do anything else or even
|
||||||
|
// give the new Box a name - when we convert it back to a Box
|
||||||
|
// and then don't use it, the Rust compiler will insert the
|
||||||
|
// necessary code to drop it (deallocating the memory).
|
||||||
|
let _ = Box::from_raw(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn login_get_id(login: *const Login) -> c_int {
|
||||||
|
let login = &*login;
|
||||||
|
login.id as c_int
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn login_get_username(login: *const Login) -> *mut c_char {
|
||||||
|
let login = &*login;
|
||||||
|
string_to_c_char(login.username.clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn login_get_password(login: *const Login) -> *mut c_char {
|
||||||
|
let login = &*login;
|
||||||
|
string_to_c_char(login.password.clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn login_get_guid(login: *const Login) -> *mut c_char {
|
||||||
|
let login = &*login;
|
||||||
|
string_to_c_char(login.guid.clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn login_set_guid(login: *mut Login, guid: *const c_char) {
|
||||||
|
let mut login = &mut *login;
|
||||||
|
login.guid = c_char_to_string(guid);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn login_get_time_created(login: *const Login) -> c_int {
|
||||||
|
let login = &*login;
|
||||||
|
login.time_created.sec as c_int
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn login_get_time_last_used(login: *const Login) -> c_int {
|
||||||
|
let login = &*login;
|
||||||
|
match login.time_last_used {
|
||||||
|
Some(tm) => tm.sec as c_int,
|
||||||
|
None => 0 as c_int
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn login_get_time_password_changed(login: *const Login) -> c_int {
|
||||||
|
let login = &*login;
|
||||||
|
login.time_password_changed.sec as c_int
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn login_get_times_used(login: *const Login) -> c_int {
|
||||||
|
let login = &*login;
|
||||||
|
login.times_used as c_int
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn login_is_valid(login: *const Login) -> c_int {
|
||||||
|
1 as c_int
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
use std::os::raw::{c_char};
|
||||||
|
use std::ffi::{CString, CStr};
|
||||||
|
|
||||||
|
pub fn c_char_to_string(cchar: *const c_char) -> String {
|
||||||
|
let c_str = unsafe { CStr::from_ptr(cchar) };
|
||||||
|
let r_str = match c_str.to_str() {
|
||||||
|
Err(_) => "",
|
||||||
|
Ok(string) => string,
|
||||||
|
};
|
||||||
|
r_str.to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn string_to_c_char(r_string: String) -> *mut c_char {
|
||||||
|
CString::new(r_string).unwrap().into_raw()
|
||||||
|
}
|
Двоичный файл не отображается.
|
@ -1 +1 @@
|
||||||
/Users/emilytoop/Development/greetings/cargo/target/aarch64-apple-ios/release/libgreetings.a: /Users/emilytoop/Development/greetings/cargo/src/lib.rs
|
/Users/emilytoop/Development/greetings/complex\ objects/cargo/target/aarch64-apple-ios/release/libgreetings.a: /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/db.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/categories.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/lib.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/utils.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/items.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/logins.rs
|
||||||
|
|
Двоичный файл не отображается.
|
@ -1 +1 @@
|
||||||
/Users/emilytoop/Development/greetings/cargo/target/armv7-apple-ios/release/libgreetings.a: /Users/emilytoop/Development/greetings/cargo/src/lib.rs
|
/Users/emilytoop/Development/greetings/complex\ objects/cargo/target/armv7-apple-ios/release/libgreetings.a: /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/logins.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/db.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/items.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/categories.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/utils.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/lib.rs
|
||||||
|
|
Двоичный файл не отображается.
|
@ -1 +1 @@
|
||||||
/Users/emilytoop/Development/greetings/cargo/target/armv7s-apple-ios/release/libgreetings.a: /Users/emilytoop/Development/greetings/cargo/src/lib.rs
|
/Users/emilytoop/Development/greetings/complex\ objects/cargo/target/armv7s-apple-ios/release/libgreetings.a: /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/logins.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/lib.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/db.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/utils.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/items.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/categories.rs
|
||||||
|
|
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/bitflags-c8b3e4b415593713/dep-lib-bitflags-c8b3e4b415593713
Normal file
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/bitflags-c8b3e4b415593713/dep-lib-bitflags-c8b3e4b415593713
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
c853c38154d23539
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[\"default\", \"example_generated\"]","target":16148831286061768677,"profile":731176819336294830,"deps":[],"local":{"Precalculated":"0.9.1"},"rustflags":[]}
|
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/gcc-da7e919133cea6e4/dep-lib-gcc-da7e919133cea6e4
Normal file
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/gcc-da7e919133cea6e4/dep-lib-gcc-da7e919133cea6e4
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
f61d980ff9e541e2
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[]","target":5868172129772039471,"profile":731176819336294830,"deps":[],"local":{"Precalculated":"0.3.54"},"rustflags":[]}
|
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/greetings-96641de78f9ebf32/dep-lib-greetings-96641de78f9ebf32
Normal file
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/greetings-96641de78f9ebf32/dep-lib-greetings-96641de78f9ebf32
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
1d5908856df33352
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[]","target":14925319972750055637,"profile":731176819336294830,"deps":[["libsqlite3-sys v0.8.1",2765925838896401487],["rusqlite v0.12.0",14583853518495018373],["time v0.1.38",259793848387565759],["uuid v0.4.0",8998852786929795973]],"local":{"MtimeBased":[[1508242361,0],"/Users/emilytoop/Development/greetings/complex objects/cargo/target/debug/.fingerprint/greetings-96641de78f9ebf32/dep-lib-greetings-96641de78f9ebf32"]},"rustflags":[]}
|
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/libc-1f3667bd38035728/dep-lib-libc-1f3667bd38035728
Normal file
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/libc-1f3667bd38035728/dep-lib-libc-1f3667bd38035728
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
cca344d20a4f40aa
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[\"default\", \"use_std\"]","target":14473354847536643916,"profile":731176819336294830,"deps":[],"local":{"Precalculated":"0.2.32"},"rustflags":[]}
|
|
@ -0,0 +1 @@
|
||||||
|
9f7bf7145586cc87
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":0,"features":"","target":0,"profile":0,"deps":[],"local":{"Precalculated":"0.8.1"},"rustflags":[]}
|
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
4f8c7e5ee58a6226
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[\"bundled\", \"default\", \"gcc\", \"min_sqlite_version_3_6_8\", \"pkg-config\", \"vcpkg\"]","target":8552008163936694488,"profile":731176819336294830,"deps":[],"local":{"Precalculated":"0.8.1"},"rustflags":[]}
|
|
@ -0,0 +1 @@
|
||||||
|
904ae3c512bda1ca
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[\"bundled\", \"default\", \"gcc\", \"min_sqlite_version_3_6_8\", \"pkg-config\", \"vcpkg\"]","target":16909721513117963967,"profile":731176819336294830,"deps":[["gcc v0.3.54",16303564983929150966],["pkg-config v0.3.9",5680356231721676471]],"local":{"Precalculated":"0.8.1"},"rustflags":[]}
|
Двоичный файл не отображается.
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
27de74133ca4c9b9
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[]","target":11676493871770579407,"profile":731176819336294830,"deps":[],"local":{"Precalculated":"0.4.2"},"rustflags":[]}
|
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/lru-cache-0d555aabc17b7664/dep-lib-lru_cache-0d555aabc17b7664
Normal file
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/lru-cache-0d555aabc17b7664/dep-lib-lru_cache-0d555aabc17b7664
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
e4c470abfd745a27
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[]","target":3007581672135113081,"profile":731176819336294830,"deps":[["linked-hash-map v0.4.2",13387411945266929191]],"local":{"Precalculated":"0.1.1"},"rustflags":[]}
|
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/pkg-config-fdeeca4d6057a82a/dep-lib-pkg_config-fdeeca4d6057a82a
Normal file
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/pkg-config-fdeeca4d6057a82a/dep-lib-pkg_config-fdeeca4d6057a82a
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
b76e729de5add44e
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[]","target":2822912055033890227,"profile":731176819336294830,"deps":[],"local":{"Precalculated":"0.3.9"},"rustflags":[]}
|
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/rand-218de9b348c3c495/dep-lib-rand-218de9b348c3c495
Normal file
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/rand-218de9b348c3c495/dep-lib-rand-218de9b348c3c495
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
8cc7e09cb3fb2f00
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[]","target":11934438946327451299,"profile":731176819336294830,"deps":[["libc v0.2.32",12267892292853212108]],"local":{"Precalculated":"0.3.17"},"rustflags":[]}
|
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/rusqlite-f664afcd165ab042/dep-lib-rusqlite-f664afcd165ab042
Normal file
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/rusqlite-f664afcd165ab042/dep-lib-rusqlite-f664afcd165ab042
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
85ed39aa814164ca
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[\"bundled\", \"libsqlite3-sys\", \"limits\"]","target":13377436585948723872,"profile":731176819336294830,"deps":[["bitflags v0.9.1",4122432294323704776],["libsqlite3-sys v0.8.1",2765925838896401487],["lru-cache v0.1.1",2835707548234990820],["time v0.1.38",259793848387565759]],"local":{"Precalculated":"0.12.0"},"rustflags":[]}
|
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/time-b572e7c6234799ac/dep-lib-time-b572e7c6234799ac
Normal file
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/time-b572e7c6234799ac/dep-lib-time-b572e7c6234799ac
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
bff8f8ef20f99a03
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[]","target":13877924226513062219,"profile":731176819336294830,"deps":[["libc v0.2.32",12267892292853212108]],"local":{"Precalculated":"0.1.38"},"rustflags":[]}
|
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/uuid-f2d0eff271777fb1/dep-lib-uuid-f2d0eff271777fb1
Normal file
Двоичные данные
complex objects/cargo/target/debug/.fingerprint/uuid-f2d0eff271777fb1/dep-lib-uuid-f2d0eff271777fb1
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
8503fc86ee58e27c
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[\"rand\", \"v4\"]","target":4584561183651667727,"profile":731176819336294830,"deps":[["rand v0.3.17",13506072755095436]],"local":{"Precalculated":"0.4.0"},"rustflags":[]}
|
Двоичные данные
complex objects/cargo/target/debug/deps/libbitflags-c8b3e4b415593713.rlib
Normal file
Двоичные данные
complex objects/cargo/target/debug/deps/libbitflags-c8b3e4b415593713.rlib
Normal file
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичные данные
complex objects/cargo/target/debug/deps/libgreetings-96641de78f9ebf32.dylib
Executable file
Двоичные данные
complex objects/cargo/target/debug/deps/libgreetings-96641de78f9ebf32.dylib
Executable file
Двоичный файл не отображается.
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>English</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>com.apple.xcode.dsym.libgreetings-96641de78f9ebf32.dylib</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>dSYM</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичные данные
complex objects/cargo/target/debug/deps/liblibsqlite3_sys-fa34ca874de3eb79.rlib
Normal file
Двоичные данные
complex objects/cargo/target/debug/deps/liblibsqlite3_sys-fa34ca874de3eb79.rlib
Normal file
Двоичный файл не отображается.
Двоичные данные
complex objects/cargo/target/debug/deps/liblinked_hash_map-de1a7f979c099c7e.rlib
Normal file
Двоичные данные
complex objects/cargo/target/debug/deps/liblinked_hash_map-de1a7f979c099c7e.rlib
Normal file
Двоичный файл не отображается.
Двоичные данные
complex objects/cargo/target/debug/deps/liblru_cache-0d555aabc17b7664.rlib
Normal file
Двоичные данные
complex objects/cargo/target/debug/deps/liblru_cache-0d555aabc17b7664.rlib
Normal file
Двоичный файл не отображается.
Двоичные данные
complex objects/cargo/target/debug/deps/libpkg_config-fdeeca4d6057a82a.rlib
Normal file
Двоичные данные
complex objects/cargo/target/debug/deps/libpkg_config-fdeeca4d6057a82a.rlib
Normal file
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичные данные
complex objects/cargo/target/debug/deps/librusqlite-f664afcd165ab042.rlib
Normal file
Двоичные данные
complex objects/cargo/target/debug/deps/librusqlite-f664afcd165ab042.rlib
Normal file
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
/Users/emilytoop/Development/greetings/complex\ objects/cargo/target/debug/libgreetings.dylib: /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/categories.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/db.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/utils.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/logins.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/items.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/lib.rs
|
Двоичный файл не отображается.
Двоичный файл не отображается.
|
@ -1 +1 @@
|
||||||
/Users/emilytoop/Development/greetings/cargo/target/i386-apple-ios/release/libgreetings.a: /Users/emilytoop/Development/greetings/cargo/src/lib.rs
|
/Users/emilytoop/Development/greetings/complex\ objects/cargo/target/i386-apple-ios/release/libgreetings.a: /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/logins.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/lib.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/utils.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/db.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/items.rs /Users/emilytoop/Development/greetings/complex\ objects/cargo/src/categories.rs
|
||||||
|
|
Двоичные данные
complex objects/cargo/target/release/.fingerprint/gcc-259b81af3fb356fe/dep-lib-gcc-259b81af3fb356fe
Normal file
Двоичные данные
complex objects/cargo/target/release/.fingerprint/gcc-259b81af3fb356fe/dep-lib-gcc-259b81af3fb356fe
Normal file
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
f22997dc4e583bd3
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[]","target":5868172129772039471,"profile":8410117760005530537,"deps":[],"local":{"Precalculated":"0.3.54"},"rustflags":[]}
|
|
@ -0,0 +1 @@
|
||||||
|
453d4066c8f5b3fc
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[\"bundled\", \"default\", \"gcc\", \"min_sqlite_version_3_6_8\", \"pkg-config\", \"vcpkg\"]","target":16909721513117963967,"profile":8410117760005530537,"deps":[["gcc v0.3.54",15220856461360310770],["pkg-config v0.3.9",14652137752737649604]],"local":{"Precalculated":"0.8.1"},"rustflags":[]}
|
Двоичный файл не отображается.
Двоичный файл не отображается.
|
@ -0,0 +1 @@
|
||||||
|
c49304e0a7d956cb
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":12695997420456152265,"features":"[]","target":2822912055033890227,"profile":8410117760005530537,"deps":[],"local":{"Precalculated":"0.3.9"},"rustflags":[]}
|
Двоичный файл не отображается.
Двоичные данные
complex objects/cargo/target/release/deps/libpkg_config-3dc93e8b17ea8845.rlib
Normal file
Двоичные данные
complex objects/cargo/target/release/deps/libpkg_config-3dc93e8b17ea8845.rlib
Normal file
Двоичный файл не отображается.
Двоичные данные
complex objects/cargo/target/universal/release/libgreetings.a
Двоичные данные
complex objects/cargo/target/universal/release/libgreetings.a
Двоичный файл не отображается.
Двоичный файл не отображается.
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче